سؤال
لدي سؤال بشأن وظيفة ثابتة في PHP.
دعونا نفترض أن لدي فئة
class test {
public function sayHi() {
echo 'hi';
}
}
إذا فعلت test::sayHi();
يعمل دون مشكلة.
class test {
public static function sayHi() {
echo 'hi';
}
}
test::sayHi();
يعمل كذلك.
ما هي الاختلافات بين الطبقة الأولى والطبقة الثانية؟
ما هو خاص حول وظيفة ثابتة؟
المحلول
في الدرجة الأولى، sayHi()
هو في الواقع طريقة مثيل تدعو إليها كطريقة ثابتة وتفلت عنها sayHi()
لا تشير أبدا إلى $this
.
وظائف ثابتة مرتبطة بالصف، وليس مثيل للفئة. كما، $this
غير متوفر من سياق ثابت ($this
لا يشير إلى أي كائن).
نصائح أخرى
ببساطة، تعمل الوظائف الثابتة بشكل مستقل عن الفصل الذي ينتمون إليه.
$ هذا يعني، هذا كائن من هذه الفئة. لا ينطبق على الوظائف الثابتة.
class test {
public function sayHi($hi = "Hi") {
$this->hi = $hi;
return $this->hi;
}
}
class test1 {
public static function sayHi($hi) {
$hi = "Hi";
return $hi;
}
}
// Test
$mytest = new test();
print $mytest->sayHi('hello'); // returns 'hello'
print test1::sayHi('hello'); // returns 'Hi'
الفرق بأكمله هو، أنت لا تحصل $this
المقدمة داخل الوظيفة الثابتة. إذا حاولت استخدام $this
, ، سوف تحصل على Fatal error: Using $this when not in object context
.
حسنا، حسنا، فرق آخر: E_STRICT
يتم إنشاء تحذير من مثالك الأول.
إن استدعاء الطرق غير الثابتة يولد تحذيرا إلى مستوى E_Strict.
باختصار، ليس لديك الكائن ك $ في الحالة الثانية، حيث أن الطريقة الثابتة هي وظيفة / طريقة للفئة وليس مثيل الكائن.
بعد محاولة أمثلة (PHP 5.3.5)، وجدت أنه في كلتا الحالتين لتحديد الوظائف التي لا يمكنك استخدامها $this
المشغل للعمل على وظائف الطبقة. لذلك لم أتمكن من العثور على فرق فيها حتى الآن. :(