বৈশিষ্ট্য প্রকারের ইঙ্গিতগুলি পরিচয় করানোর সময় কেন হঠাৎ আমি "প্রারম্ভিককরণের আগে ধরণের সম্পত্তি ব্যবহার করা উচিত নয়" ত্রুটি পাচ্ছি?


10

নতুন প্রবর্তিত সম্পত্তি ধরণের ইঙ্গিতগুলি ব্যবহার করার জন্য আমি আমার শ্রেণির সংজ্ঞাগুলি আপডেট করেছি:

class Foo {

    private int $id;
    private ?string $val;
    private DateTimeInterface $createdAt;
    private ?DateTimeInterface $updatedAt;

    public function __construct(int $id) {
        $this->id = $id;
    }


    public function getId(): int { return $this->id; }
    public function getVal(): ?string { return $this->val; }
    public function getCreatedAt(): ?DateTimeInterface { return $this->createdAt; }
    public function getUpdatedAt(): ?DateTimeInterface { return $this->updatedAt; }

    public function setVal(?string $val) { $this->val = $val; }
    public function setCreatedAt(DateTimeInterface $date) { $this->createdAt = $date; }
    public function setUpdatedAt(DateTimeInterface $date) { $this->updatedAt = $date; }
}

কিন্তু মতবাদে আমার সত্তা বাঁচানোর চেষ্টা করার সময় আমি এই বলে একটি ত্রুটি পাচ্ছি:

টাইপ করা সম্পত্তি আরম্ভের আগে অবশ্যই অ্যাক্সেস করা উচিত নয়

এটি কেবল $idবা এর সাথেই ঘটে না $createdAtতবে ঘটে $valueবা $updatedAtযা হ'ল সংক্ষিপ্ত বৈশিষ্ট্য।

উত্তর:


20

যেহেতু পিএইচপি 7.4 বৈশিষ্ট্যের জন্য টাইপ-হিন্টিং প্রবর্তন করে, তাই সমস্ত বৈশিষ্ট্যের জন্য বৈধ মান সরবরাহ করা বিশেষত গুরুত্বপূর্ণ, যাতে সমস্ত বৈশিষ্ট্যের মানগুলি তাদের ঘোষিত প্রকারের সাথে মেলে।

কোনও ভেরিয়েবল যা কখনও বরাদ্দ করা হয়নি তার কোনও nullমূল্য নেই, তবে এটি এমন একটি undefinedরাজ্যে রয়েছে যা কোনও ঘোষিত প্রকারের সাথে মেলে নাundefined !== null

উপরের কোডটির জন্য, যদি আপনি তা করেন:

$f = new Foo(1);
$f->getVal();

আপনি পাবেন:

মারাত্মক ত্রুটি: আনকড ত্রুটি: টাইপ করা সম্পত্তি ফু: $ ভ্যালিয়ালটি আরম্ভের আগে অবশ্যই অ্যাক্সেস করা উচিত নয়

যেহেতু $valতন্ন তন্ন হয় stringনা nullযখন এটি অ্যাক্সেস।

এটিকে ঘুরে দেখার উপায় হ'ল ঘোষিত ধরণের সাথে মিলে এমন সমস্ত বৈশিষ্ট্যের মান নির্ধারণ করা। আপনার পছন্দ এবং সম্পত্তির ধরণের উপর নির্ভর করে আপনি সম্পত্তিটির জন্য বা নির্মাণের সময় এটি ডিফল্ট মান হিসাবে করতে পারেন।

উদাহরণস্বরূপ, উপরেরগুলির জন্য আপনি এটি করতে পারেন:

class Foo {

    private int $id;
    private ?string $val = null; // <-- declaring default null value for the property
    private DateTimeInterface $createdAt;
    private ?DateTimeInterface $updatedAt;

    public function __construct(int $id) {
        // and on the constructor we set the default values for all the other 
        // properties, so now the instance is on a valid state
        $this->id = $id;
        $this->createdAt = new DateTimeImmutable();
        $this->updatedAt = new DateTimeImmutable();
    }

এখন সমস্ত বৈশিষ্ট্যের একটি বৈধ মান থাকবে এবং উদাহরণটি একটি বৈধ অবস্থায় থাকবে।

এটি বিশেষত প্রায়শই হিট করতে পারে যখন আপনি সত্তা মানগুলির জন্য ডিবি থেকে আগত মানগুলিতে নির্ভর করে। যেমন স্বতঃ উত্পাদিত আইডি, বা তৈরি এবং / অথবা আপডেট হওয়া মান; যা প্রায়শই ডিবি উদ্বেগ হিসাবে ছেড়ে যায়।

স্বতঃ উত্পাদিত আইডিগুলির জন্য, প্রস্তাবিত উপায়টি হ'ল প্রকারের ঘোষণাকে পরিবর্তন করতে হবে ?int $id = null। বাকি সমস্তগুলির জন্য, কেবল সম্পত্তির ধরণের জন্য উপযুক্ত মানটি চয়ন করুন।


-5

আমার ত্রুটি:

"Typed property Proxies\\__CG__\\App\\Entity\\Organization::$ must not be accessed before initialization (in __sleep)"

আমার সমাধান - ক্লাসে পরবর্তী পদ্ধতি যুক্ত করুন:

public function __sleep()
{
    return [];
}

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