function載入後會取得記憶體位置,
透過static宣告,在後續載入時,記憶體位置都一樣,相對較節省記憶體。
但也因為共享記憶體,所以要特別注意存取權限以及存取時機。
self、static、parent (資料來源)
class A { public static function foo() { static::who(); } public static function who() { echo __CLASS__."\n"; } } class B extends A { public static function test() { A::foo(); parent::foo(); self::foo(); } public static function who() { echo __CLASS__."\n"; } } class C extends B { public static function who() { echo __CLASS__."\n"; } } C::test();
輸出結果
A
C
C
說明
1、
A::foo();
可以在任何地方執行的,固定指向A的foo();
2、
parent::foo();
C的parent是B,B的parent是A,回溯找到了A的foo方法;
static::who();
static::調用的方法會被子類覆蓋,所以優先調用C的who()方法,
如果C的who方法不存在會調用B的who方法,
如果B的who方法不存在會調用A的who方法。
所以,輸出結果是’C’。
3、
self::foo();
這個self::是在B中使用的,所以self::等價於B::,
但是B沒有實現foo方法,B又繼承自A,
所以我們實際上調用了A::foo()這個方法。
foo方法使用了static::who()語句,導致我們又調用了C的who函數。
class Father { public function getNewFather() { return new self(); } public function getNewCaller() { return new static(); } } class Sun1 extends Father { } class Sun2 extends Father { } $f = new Father(); $sun1 = new Sun1(); $sun2 = new Sun2(); echo get_class($f->getNewFather()).""; echo get_class($f->getNewCaller()).""; echo get_class($sun1->getNewFather()).""; echo get_class($sun1->getNewCaller()).""; echo get_class($sun2->getNewFather()).""; echo get_class($sun2->getNewCaller())."";
輸出結果
Father
Father
Father
Sun1
Father
Sun2
說明
self本身,無論在什麼地方調用,都是取到Father本身。
static,只有在出現繼承的時候才會有區別。就是返回真正的調用者。