নতুন স্ব বনাম নতুন স্থিতিশীল


513

আমি পিএইচপি 5.3 লাইব্রেরি পিএইচপি 5.2 তে কাজ করার জন্য রূপান্তর করছি। আমার পথে দাঁড়িয়ে থাকা মূল জিনিসটি হ'ল দেরী স্থির বাইন্ডিংয়ের ব্যবহার return new static($options);, যদি আমি এটিকে রূপান্তর করি তবে আমি return new self($options)কি একই ফলাফল পাব?

মধ্যে পার্থক্য কি new selfএবং new static?

উত্তর:


887

আমি কি একই ফলাফল পাব?

আসলে তা না. যদিও আমি পিএইচপি 5.2 এর জন্য কোনও কাজের কথা জানি না।

মধ্যে পার্থক্য কি new selfএবং new static?

selfমূলশব্দটি newআসলে একই ক্লাসে লিখিত হয়।

static, পিএইচপি 5.3 এর শেষের স্থিতিশীল বাইন্ডিংগুলিতে, আপনি পদ্ধতিটিকে যে শ্রেণিবিন্যাস বলেছিলেন সেটিকে বোঝায় to

নিম্নলিখিত উদাহরণে, Bউভয় পদ্ধতি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত Aselfআবাহন আবদ্ধ হয় Aকারণ এটি সংজ্ঞায়িত হয়েছে তা Aপ্রথম পদ্ধতি 'র বাস্তবায়ন, যেহেতু staticবলা বর্গ আবদ্ধ হয় (এছাড়াও দেখুন get_called_class())।

class A {
    public static function get_self() {
        return new self();
    }

    public static function get_static() {
        return new static();
    }
}

class B extends A {}

echo get_class(B::get_self());  // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A

জ্ঞান করে তোলে। আমি মনে করি সর্বোত্তম বেট হ'ল ক্লাসের নামটি ফাংশনটিতে পাস করা যা দেরী স্ট্যাটিক বাইন্ডিং ব্যবহার করছে এবং তারপরে নতুন $ ClassName ($ বিকল্পগুলি) ফিরিয়ে দেবে;
মাইকে

12
আপনাকে ক্লাসের নামটি "পাস" করতে হবে না, আপনি সর্বদা করতে পারেন get_called_class(), যা কার্যকরভাবে একই রকম __CLASS__তবে এলএসবি সামঞ্জস্যপূর্ণ।
ছায়ানহ্যান্ড

7
<পিএইচপি 5.3-তে get_called_class বিদ্যমান নেই। অতএব আপনি যদি পিএইচপি 5.2 তে ইনস্ট্যান্টেটেড অবজেক্টের ক্লাসের নাম পেতে চান তবে পিএইচপি 5.3 থেকে পিএইচপি
5.2- র

2
স্ব হিসাবে পরিচিত ফাংশন :: দ্য ফাংশন () এমন আচরণ করে যে "আমি শারীরিকভাবে যার সাথে ক্লাস করি তার প্রসঙ্গে আমি সম্পাদন করব" " এবং অবিচলিত হিসাবে পরিচিত ফাংশন :: theFunction () "আমি যে শ্রেণীর প্রকৃতপক্ষে বাইরের বিশ্বকে ডেকেছি" তার প্রেক্ষাপটে সম্পাদন করব like (উত্তরাধিকারের পরিস্থিতি ধরে নেওয়া)। ধন্যবাদ
শুভ্রাংশু

2
আমার মাথায়, আমি কেবল স্বজ্ঞাত যা যা তা গ্রহণ করি এবং এর বিপরীত করি। আপনি নামকরণের ভিত্তিতে ভাববেন, selfনিজেই ফিরে আসবেন এবং staticএমন কিছু ফিরে আসবেন যা উপেক্ষা করা যাবে না ... তবে দেখুন এবং দেখুন এটির বিপরীত। আমি পিএইচপি'র নামকরণ, সম্মেলন এবং সামগ্রিক স্টাইল দ্বারা মুগ্ধ হতে কখনও থামি না। -_-
আহ্নবিজক্যাড

23

যদি এই কোডটির পদ্ধতি স্থিতিশীল না হয় তবে আপনি ব্যবহার করে 5.2-তে একটি ওয়ার্ক-এয়ার পেতে পারেন get_class($this)

class A {
    public function create1() {
        $class = get_class($this);
        return new $class();
    }
    public function create2() {
        return new static();
    }
}

class B extends A {

}

$b = new B();
var_dump(get_class($b->create1()), get_class($b->create2()));

ফলাফলগুলো:

string(1) "B"
string(1) "B"

17
পদ্ধতিটি যদি স্থির না হয় তবে দেরীতে স্থির বাইন্ডিংগুলি সম্পূর্ণ অপ্রাসঙ্গিক হয়ে যায়।
BoltClock

1
উদাহরণস্বরূপ, আপনি এটি "অনুলিপি" পদ্ধতিতে ব্যবহার করতে পারেন, যেখানে অবজেক্টটি ব্যবহার না করে অনুলিপি করা হয়েছে clone, তবে কেবল বৈশিষ্ট্যগুলি পুনরায় তৈরি এবং সেট করে। $copy = new static(); $copy->set($this->get()); return $copy;
মারিয়াস বালিয়েটিস

9
পছন্দ করেছেন আপনি যদি সাবক্লাসের উদাহরণ পদ্ধতির মধ্যে থেকে ওভাররাইড হওয়া স্ট্যাটিক পদ্ধতিটি কল করছেন, তবে আপনার পছন্দটি self::বা static::সেই স্ট্যাটিক পদ্ধতির বেস ক্লাসের অথবা সাবক্লাসের সংস্করণটি ব্যবহৃত হয়েছে কিনা তা প্রভাবিত করছে। কোনও কারণের অভাবে যে এমন পরিস্থিতি সহজাতভাবে খারাপ অভ্যাসকে ইঙ্গিত করে (এবং এটি কেন হওয়া উচিত তার কোনও কারণ আমি দেখতে পাচ্ছি না), এর মধ্যে পছন্দ self::এবং static::অ স্থির পদ্ধতিগুলির মধ্যে যেমনটি প্রাসঙ্গিক তেমনি প্রাসঙ্গিক স্থির পদ্ধতি। আমি কি আপনার মন্তব্য ভুল বুঝেছি, বা আমাদের মধ্যে একটি সহজভাবে ভুল?
মার্ক

4
@ মার্ক আমেরি: হুম আমি এটা ভাবিনি। তুমি একেবারেই সঠিক. আমি ধরে নিয়েছিলাম যে প্রশ্নে উদাহরণস্বরূপ পদ্ধতিতে কোনও স্থিতিশীল পদ্ধতি কল করা যাচ্ছিল না, তবে আপনার উদাহরণের ভিত্তিতে আমি দেখতে পাচ্ছি যে এটি কীভাবে খুব নির্লজ্জ ধারণা হবে।
BoltClock

দেরীতে স্ট্যাটিক বাইন্ডিংস ডক => php.net/manual/en/language.oop5.late-static-bindings.php
DevWL

7

অন্যের উত্তর ছাড়াও:

স্ট্যাটিক :: রানটাইম তথ্য ব্যবহার করে গণনা করা হবে।

এর অর্থ আপনি static::শ্রেণীর সম্পত্তিতে ব্যবহার করতে পারবেন না কারণ বৈশিষ্ট্যের মানগুলি:

সংকলন সময়ে মূল্যায়ন করতে সক্ষম হতে হবে এবং রান-টাইম তথ্যের উপর নির্ভর করে না।

class Foo {
    public $name = static::class;

}

$Foo = new Foo;
echo $Foo->name; // Fatal error

ব্যবহার self::

class Foo {
    public $name = self::class;

}
$Foo = new Foo;
echo $Foo->name; // Foo

দয়া করে মনে রাখবেন যে আমি তৈরি কোডটিতে মারাত্মক ত্রুটি মন্তব্যটি কোথায় ত্রুটি ঘটেছে তা নির্দেশ করে না, মন্তব্যগুলিতে @Grapestain হিসাবে অবজেক্টটি ইনস্ট্যান্ট করার আগে ত্রুটিটি ঘটেছিল তার আগে


4
public $name = static::class;উদাহরণস্বরূপ প্রস্তাবিত হিসাবে ত্রুটিটি line নং লাইনে নয়, 2 লাইনে নিক্ষেপ করুন Note ত্রুটিটি বলে: "স্থিতিশীল :: ক্লাসটি সংকলন-সময় শ্রেণীর নাম রেজোলিউশনের জন্য ব্যবহার করা যায় না" যা সমস্যাটি নির্দেশ করে যে আপনি যেখানে $ নাম ক্ষেত্রটি অ্যাক্সেস করার চেষ্টা করছেন তা নয়, বরং পিএইচপি ক্লাসের সংকলনে অনেক আগে। লাইন 7 (বা 6) প্রথম উদাহরণে পৌঁছাবে না।
sbnc.eu

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

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