PHP面向?qū)ο缶幊讨校瑂tatic和self一直是讓初學(xué)者感到困惑的概念之一。
static表示靜態(tài)變量或者靜態(tài)方法,我們可以直接使用類名來調(diào)用,而不需要實例化一個對象。self則表示當(dāng)前類的實例,我們只能在使用它時通過類名來調(diào)用。
現(xiàn)在,讓我們通過一些具體的例子來更好地理解static和self。
class Person { public static $name = "Tom"; public static function sayHello() { echo "Hello, " . self::$name . "!</br>"; } } class Student extends Person { public static $name = "Alice"; } Person::sayHello(); //輸出:Hello, Tom! Student::sayHello(); //輸出:Hello, Tom!
在上面的例子中,我們定義了一個Person類和一個Student類,兩個類中都定義了一個靜態(tài)變量$name。在Person類中,我們定義了一個靜態(tài)方法sayHello,用來打印 Hello, $name! 由于static變量是跟類相關(guān),因此我們可以通過self來引用Person類中的$name,使用Person::sayHello()調(diào)用sayHello方法將打印出 Hello, Tom!。
現(xiàn)在,我們通過Student::sayHello()來調(diào)用sayHello方法,我們期望看到的是 Hello, Alice!,但實際輸出結(jié)果是Hello, Tom!。這是因為雖然Student類中也定義了$name靜態(tài)變量,但sayHello方法中使用的是self,因此還是引用的是Person類中的$name靜態(tài)變量。
為了得到我們期望的 Hello, Alice!,我們可以在sayHello方法中使用static,而不是self。
class Person { public static $name = "Tom"; public static function sayHello() { echo "Hello, " . static::$name . "!</br>"; } } class Student extends Person { public static $name = "Alice"; } Person::sayHello(); //輸出:Hello, Tom! Student::sayHello(); //輸出:Hello, Alice!
在上面的例子中,我們使用static代替self來引用靜態(tài)變量,然后通過Person::sayHello()和Student::sayHello()分別調(diào)用sayHello方法。最終的輸出結(jié)果就是 Hello, Tom! 和 Hello, Alice!。
事實上,static和self的區(qū)別不僅僅體現(xiàn)在引用靜態(tài)變量上,它們在引用靜態(tài)方法中也有不同的效果。這時候,我們需要通過觀察引用類型的變化來看到它們的差別。
class A { public static function who() { echo __CLASS__; } public static function test() { static::who(); } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); //輸出 B
在上面的例子中,我們定義了一個A類和一個B類。在A類中,我們定義了一個靜態(tài)方法who,輸出的是當(dāng)前類的名稱。在A類中還定義了一個名為test的靜態(tài)方法,其中調(diào)用了who方法,我們期望看到的結(jié)果是A::who(),即輸出A類的名稱。
現(xiàn)在,我們通過B::test()來調(diào)用test方法,我們期望看到的是 B 類的名稱,而不是 A 類的名稱。我們可以看到,輸出結(jié)果確實是B。這是因為在test方法中,使用的是static來調(diào)用who方法。如果使用的是self,輸出結(jié)果就會是A。
到這里,我們應(yīng)該對static和self有了更深入的理解,它們可以用來引用靜態(tài)變量,也可以用來引用靜態(tài)方法。但在使用它們的時候,我們需要有一個清晰的判斷,看什么情況下使用static,什么情況下使用self,以便我們得到我們期望的結(jié)果。