পিএইচপি 7 এর পূর্বে "স্ট্রিংয়ের একটি উদাহরণ থাকতে হবে, স্ট্রিং দেওয়া উচিত" কীভাবে সমাধান করবেন?


217

আমার কোডটি এখানে:

function phpwtf(string $s) {
    echo "$s\n";
}
phpwtf("Type hinting is da bomb");

এই ত্রুটির ফলাফল যা:

ক্যাপচারযোগ্য মারাত্মক ত্রুটি: পিএইচপিডব্লিউটিএফ () এর কাছে আর্গুমেন্ট 1 পাস হয়েছে স্ট্রিংয়ের একটি উদাহরণ হতে হবে

পিএইচপি একই শ্বাসে পছন্দসই ধরণটি স্বীকৃতি দেয় এবং প্রত্যাখ্যান করা আরও অরওলিয়ানর চেয়ে বেশি। পাঁচটি লাইট আছে, এটি জঘন্য।

পিএইচপি-তে স্ট্রিংয়ের জন্য টাইপ ইঙ্গিতের সমতুল্য কী? উত্তরের বোনাস বিবেচনা যা এখানে ঠিক কী চলছে তা ব্যাখ্যা করে।


5
ঠিক আছে, কারণ আপনি এটি ভুল করছেন। আপনার কোডটি দিয়ে কাজ করার কথা নয় with পিএইচপি ডক্সে প্রকারের জাগলিং সম্পর্কে পড়ুন। পিএইচপি গতিশীল টাইপযুক্ত এবং দুর্বল টাইপযুক্ত। আপনি স্ট্রিংয়ের জন্য একটি আর্গুমেন্ট কাস্ট করতে (স্ট্রিং) ব্যবহার করতে পারেন (তবে কেবলমাত্র ফাংশন বডিতে) তবে আপনি কেবল কোড স্নিপেটে যেমন জিনিস এবং অ্যারেগুলি ইঙ্গিত করতে পারেন।
রিচার্ড নপ

7
সমস্যাটি হল আপনি একটি ছোট ভুল করেছেন। আছে চার লাইট!
সিজে ডেনিস

@ গর্ডন, আমি 5.6 তে পরীক্ষা করেছি। এখনও ভাগ্য নেই।
পেসারিয়ার

@ পেসারিয়র দয়া করে সর্বশেষ উন্নয়নের জন্য wiki.php.net/rfc অনুসরণ করুন ।
গর্ডন

3
স্পষ্টতই, স্কেলার টাইপ-হিন্টিং (ওপি হিসাবে স্বজ্ঞাতভাবে উপরের জিনিস হিসাবে প্রত্যাশিত) শেষ পর্যন্ত উত্স অনুসারে পিএইচপি * 7 * এর জন্য একটি আরএফসির অধীনে অনুমোদিত হয়েছে । অনুমোদিত আরএফসি স্পষ্টতই টাইপ-চেকিং রিটার্ন-ভ্যালুগুলির পাশাপাশি পরামিতিগুলির (আর্গুমেন্ট) জন্য সিনট্যাকটিক চিনি সরবরাহ করে । আসতে আসতে অনেকক্ষণ কেটে গেছে।
সেলডমনিডি

উত্তর:


204

পিএইচপি 7 পূর্বে ইঙ্গিতটি কেবলমাত্র বস্তুর ধরণের এবং অ্যারেগুলিকে জোর করতে ব্যবহৃত হতে পারে। স্কেলারের প্রকারগুলি টাইপ-ইঙ্গিতযোগ্য নয়। এক্ষেত্রে শ্রেণীর একটি অবজেক্ট stringআশা করা যায় তবে আপনি এটিকে একটি স্কেলার দিচ্ছেন string। ত্রুটির বার্তা মজার হতে পারে তবে এটি দিয়ে কাজ করার কথা নয়। গতিশীল টাইপিং সিস্টেমটি দেওয়া, এটি আসলে কিছুটা বিকৃত অর্থে তৈরি করে।

আপনি কেবল ম্যানুয়ালি "ইঙ্গিত" স্কেলারের প্রকারগুলি টাইপ করতে পারেন :

function foo($string) {
    if (!is_string($string)) {
        trigger_error('No, you fool!');
        return;
    }
    ...
}

1
@ নির্ধারণ করুন, বিপরীত প্রকারের ইঙ্গিত দেওয়ার জন্য কোনও বাক্য গঠন আছে? যেমন অ্যারে ছাড়া আর কিছু anything
পেসারিয়ার 19

@ পেসিয়ার নং, নেই।
প্রতারণা করুন

4
এই উত্তরটি পিএইচপি 7
জোস নোবাইল 6'15

24

থেকে পিএইচপি এর ম্যানুয়াল :

প্রকারের ইঙ্গিতগুলি কেবল অবজেক্ট এবং অ্যারের হতে পারে (পিএইচপি 5.1 থেকে) টাইপ। আন্ত এবং স্ট্রিং সহ চিরাচরিত প্রকারের ইঙ্গিতটি সমর্থিত নয়।

সুতরাং আপনি এটি আছে। ত্রুটি বার্তাটি সত্যিই সহায়ক নয়, যদিও আপনাকে তা দিচ্ছি।

** 2017 সম্পাদনা করুন **

পিএইচপি 7 আরও ফাংশন ডেটা প্রকারের ঘোষণাগুলি প্রবর্তন করেছে এবং পূর্বোক্ত লিঙ্কটি ফাংশন আর্গুমেন্টে স্থানান্তরিত করা হয়েছে : প্রজ্ঞাপন টাইপ করুন । এই পৃষ্ঠা থেকে:

বৈধ প্রকার

  • শ্রেণি / ইন্টারফেসের নাম : প্রদত্ত শ্রেণি বা ইন্টারফেসের নামের পরামিতি অবশ্যই হওয়া উচিত। (পিএইচপি 5.0.0 থেকে)
  • স্ব : প্যারামিটারটি অবশ্যই একই শ্রেণীর উদাহরণ হতে হবে যেমন পদ্ধতিটি নির্ধারিত হয়েছে। এটি কেবল শ্রেণি এবং উদাহরণ পদ্ধতিতে ব্যবহার করা যেতে পারে। (পিএইচপি 5.0.0 থেকে)
  • অ্যারে : প্যারামিটারটি অবশ্যই একটি অ্যারে হবে। (পিএইচপি 5.1.0 থেকে) কলযোগ্য প্যারামিটারটি অবশ্যই একটি বৈধ কলযোগ্য পিএইচপি 5.4.0
  • বুল : প্যারামিটারটি অবশ্যই একটি বুলিয়ান মান। (পিএইচপি 7.0.0 থেকে)
  • ভাসা : প্যারামিটার অবশ্যই একটি ভাসমান পয়েন্ট নম্বর হতে হবে। (পিএইচপি 7.0.0 থেকে)
  • int : প্যারামিটারটি একটি পূর্ণসংখ্যা হতে হবে। (পিএইচপি 7.0.0 থেকে)
  • স্ট্রিং : প্যারামিটারটি অবশ্যই একটি স্ট্রিং। (পিএইচপি 7.0.0 থেকে)
  • পুনরাবৃত্তিযোগ্য : প্যারামিটারটি অবশ্যই একটি অ্যারে বা ট্রান্সফেসেবলের উদাহরণ হতে হবে। (পিএইচপি 7.1.0 থেকে)

সতর্কতা

উপরের স্কেলার প্রকারের জন্য উপকরণগুলি সমর্থিত নয়। পরিবর্তে, তারা শ্রেণি বা ইন্টারফেসের নাম হিসাবে বিবেচিত হয়। উদাহরণস্বরূপ, বুলিয়ানকে প্যারামিটার বা রিটার্ন টাইপ হিসাবে ব্যবহার করার জন্য একটি আর্গুমেন্ট বা রিটার্ন মান প্রয়োজন হবে যা বুল টাইপের পরিবর্তে ক্লাস বা ইন্টারফেস বুলিয়ান হিসাবে উদাহরণস্বরূপ:

<?php
   function test(boolean $param) {}
   test(true);
 ?>

উপরের উদাহরণটি আউটপুট দেবে:

 Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of boolean, boolean given, called in - on line 1 and defined in -:1

শেষ সতর্কতাটি ত্রুটিটি বুঝতে আসলে তাত্পর্যপূর্ণ হয় "আর্গুমেন্ট অবশ্যই স্ট্রিংয়ের স্ট্রিং, স্ট্রিং দেওয়া উচিত"; যেহেতু বেশিরভাগ ক্ষেত্রে কেবল শ্রেণি / ইন্টারফেসের নামগুলি আর্গুমেন্ট টাইপ হিসাবে অনুমোদিত, পিএইচপি কোনও শ্রেণীর নাম "স্ট্রিং" সনাক্ত করার চেষ্টা করে তবে কোনওটি খুঁজে পায় না কারণ এটি একটি আদিম প্রকার, সুতরাং এই বিশ্রী ত্রুটির সাথে ব্যর্থ হয়।


8

পিএইচপি "ইঙ্গিত" দেয় যেখানে আপনি কোনও শ্রেণি সরবরাহ করে কোনও অবজেক্ট নির্দিষ্ট করার জন্য। পিএইচপি ম্যানুয়াল অনুসারে, "টাইপ ইঙ্গিতগুলি কেবলমাত্র অবজেক্ট এবং অ্যারের হতে পারে (পিএইচপি 5.1 থেকে) টাইপ int আপনার "স্ট্রিং" বেছে নেওয়ার কারণে ত্রুটিটি বিভ্রান্তিকর - তার জায়গায় "মাই ক্লাস" রাখুন এবং ত্রুটিটি অন্যভাবে পড়বে: "পিএইচপিডব্লিউটিএফ-এ পাস করা আর্গুমেন্টটি অবশ্যই মাই ক্লাসের উদাহরণ হতে হবে, স্ট্রিং দেওয়া হয়েছে"


3

অন্যরা ইতিমধ্যে বলেছে, টাইপ ইঙ্গিতটি কেবলমাত্র বস্তুর ধরণের জন্য কাজ করে। তবে আমি মনে করি আপনি যে বিশেষ ত্রুটিটি ট্রিগার করেছেন তা আসন্ন স্ট্রিং ধরণের স্প্লস্ট্রিংয়ের প্রস্তুতির মধ্যে থাকতে পারে ।

তত্ত্বের ক্ষেত্রে এটি একটি স্ট্রিংয়ের মতো আচরণ করে তবে এটি যেহেতু এটি একটি বস্তু তাই বস্তুর ধরণের যাচাইকরণটি পাস করবে। দুর্ভাগ্যক্রমে এটি এখনও পিএইচপি 5.3 এ নেই, 5.4 এ আসতে পারে, তাই এটি পরীক্ষা করে দেখেনি।


2

পিএইচপি 7.0 এর হিসাবে টাইপ ঘোষণা, স্কালে ধরনের অনুমতি তাই এই ধরনের এখন পাওয়া যায়: self, array, callable, bool, float, int, string। প্রথম তিন পিএইচপি 5 পাওয়া ছিল, কিন্তু আপনি অন্য কিছু (যেমন ব্যবহার করেন, তাহলে গত চার পিএইচপি 7. নতুন হয় integerবা boolean) যে একটি বর্গ নাম হিসেবে ব্যাখ্যা করা হবে না।

আরও তথ্যের জন্য পিএইচপি ম্যানুয়াল দেখুন


0

নিরাপদ এবং সুন্দর নাও হতে পারে তবে আপনার অবশ্যই:

class string
{
    private $Text;
    public function __construct($value)
    {
        $this->Text = $value;
    }

    public function __toString()
    {
        return $this->Text;
    }
}

function Test123(string $s)
{
    echo $s;
}

Test123(new string("Testing"));

5
আমি এখনও তৈরি করতে পারেনিnew string(array(1,2,3))
জিমি টি

0

লারাভেল কন্ট্রোলার থেকে কোনও পিএইচপি ফাইলে কোনও ফাংশন চাওয়ার সময় আমি এই ত্রুটি পেয়েছি।

ঘন্টা দুয়েক পর, আমি সমস্যা পাওয়া যায়: আমি ব্যবহার করছিলেন এই $ একটি স্ট্যাটিক ফাংশন থেকে।


Using $this when not in object contextপ্রকৃতপক্ষে একটি গুপ্ত বার্তা।
বেন ফ্রানসেন

0

(মূলত তাঁর প্রশ্নে লেপোয়াররা পোস্ট করেছেন )

ত্রুটি বার্তাটি একটি বড় কারণে বিভ্রান্ত করছে:

আদিম ধরণের নাম পিএইচপি-তে সংরক্ষিত নেই

নিম্নলিখিত সমস্ত বৈধ শ্রেণীর ঘোষণা রয়েছে:

class string { }
class int { }
class float { }
class double { }

আমার ভুলটি এই ভেবেছিল যে ত্রুটি বার্তাটি কেবল স্ট্রিং আদিম ধরণের প্রতি নির্দেশ করে - 'উদাহরণ' শব্দটি আমাকে বিরতি দেওয়া উচিত ছিল। আরও উদাহরণস্বরূপ উদাহরণ:

class string { }
$n = 1234;
$s1 = (string)$n;
$s2 = new string();
$a = array('no', 'yes');
printf("\$s1 - primitive string? %s - string instance? %s\n",
        $a[is_string($s1)], $a[is_a($s1, 'string')]);
printf("\$s2 - primitive string? %s - string instance? %s\n",
        $a[is_string($s2)], $a[is_a($s2, 'string')]);

আউটপুট:

1 s1 - আদিম স্ট্রিং? হ্যাঁ - স্ট্রিং উদাহরণ? না

$ এস 2 - আদিম স্ট্রিং? না - স্ট্রিং উদাহরণ? হ্যাঁ

পিএইচপি এটা সম্ভব একটি জন্য stringএকটি হতে stringযখন এটি আসলে একটি ব্যাপার ছাড়া string। অন্তর্নিহিত ধরণের রূপান্তর ব্যবহার করে এমন কোনও ভাষার মতো, প্রসঙ্গ সবকিছুই।


-1

আমার মনে হয় পিএইচপি তে টাইপকাস্টিংটি ব্লকের ভিতরে রয়েছে, পিএইচপি অন স্ট্রিং আপত্তি নয় কারণ আমি জানি:

<?php
function phpwtf($s) {
    $s = (string) $s;
    echo "$s\n";
}
phpwtf("Type hinting is da bomb");

2
ফাংশনে পাস করা অন্যান্য মান আটকাতে আপনি আপনার ফাংশনের অভ্যন্তরে is_string () বৈধতা যুক্ত করতে পারেন।
subosito

1
(string) $s$sস্ট্রিংয়ে কাস্ট করা যায় না এমন কোনও বস্তু হলে কোনও ত্রুটি ফেলতে পারে (কোনও __toString()পদ্ধতি প্রয়োগ করা হয়নি ), সুতরাং এটি এতটা সহজ নয়
ইয়ানিক রোচন

হ্যাঁ ইয়ানিক ঠিক বলেছেন। কিন্তু আমরা সমস্ত ইনপুটকে স্ট্রিং হতে বাধ্য করতে পারি না? ব্যতিক্রম খেলতে আসে। আমরা বাছাইয়ের বৈধতাগুলিকে একত্রিত করতে পারি এবং
বাকীগুলির

আমি কেবল বলছি যে ভেরিয়েবলটি কাস্ট করা যায় কিনা তা পরীক্ষা না করে প্রথমে স্ট্রিংয়ে কিছু পরিবর্তনশীল ingালাই এড়ানো উচিত, কারণ ব্যতিক্রমগুলি ধরা ব্যয়বহুল এবং খারাপ ডিজাইনের ধরণগুলি / কোডিং হ্যাবিটগুলির দিকে পরিচালিত করে।
ইয়ানিক রোচন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.