سؤال

لدي سؤال بشأن وظيفة ثابتة في 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 المشغل للعمل على وظائف الطبقة. لذلك لم أتمكن من العثور على فرق فيها حتى الآن. :(

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top