1. 以static::來調用,是在運行的那個時刻才執行綁定操作;
2. 父類中有個方法是延遲綁定的,在子類::調用這個方法的時候它**又回到調用的子類開始向上找**;
**example1:**
```php
class Human {
public static function whoami() {
echo '來自父類的whoami在執行';
}
public static function say() {
self::whoami(); // 子類內沒有say方法,找到了父類這里
// 在這里的self 指的是 父類
}
public static function say2() {
static::whoami(); // 子類也沒有say2方法,又找到父類這里
// 但是父類用static::whoami,
// 指調用你子類自己的whoami方法
}
}
class Stu extends Human{
public static function whoami () {
echo '來自子類的whoami在執行';
}
}
// 來自父類的whoami在執行
Stu::say();//調用Stu類的say方法,但Stu類沒有say方法,就向其父類尋找,找到父類以后,發現父類的say方法里面又調用self::whoami();此時self里面其實是有兩個whoami的方法,但由于本次調用發生的環境是在父類的say方法里面,所以它調用的是父類的whoami方法,不調用子類的whoami方法;
echo PHP_EOL;
// 來自子類的whoami在執行
Stu::say2(); //調用Stu類的say2方法,但Stu類沒有say2方法,就向其父類尋找,找到父類say2以后,發現父類的say2方法里面用了static延遲綁定了whoami方法,而此時發生調用的子類里面有whoami方法(如果沒有就向父類尋找),所以在此時是綁定在子類的whoami上,所以這里調用的是子類的whoami方法;
```
**example2:**
```php
class Animal {
const age = 1;
public static $leg = 4;
public static function cry() {
echo '嗚嗚<br />';
}
public static function t1() {
self::cry();
echo self::age,'<br />';
echo self::$leg,'<br />';
}
public static function t2() {
static::cry();
echo static::age,'<br />';
echo static::$leg,'<br />';
}
}
class Human extends Animal {
public static $leg = 2;
public static function cry() {
echo '哇哇<br />';
}
}
class Stu extends Human {
const age = 16;
public static function cry() {
echo '嚶嚶<br />';
}
}
Stu::t1(); //嗚嗚,1,4
/*
↑↑:一直找到Animal類,Animal類的t1方法是普通綁定,所以是嗚嗚,1,4
*/
Stu::t2(); // 嚶嚶,16,2
/*
↑↑:一直找到Animal類,Animal類的t2方法是延遲綁定,又回到Stu類開始找,Stu類有cry方法,所以是嚶嚶,有age屬性所以是16,沒有leg屬性,然后向上找,一直找到既可,所以是2
*/
```
## new static()與new self()
1. self - 就是這個類,是代碼段里面的這個類。new self就是實例化本類;
2. static - PHP 5.3加進來的只得是當前這個類,有點像$this的意思,從堆內存中提取出來,訪問的是當前實例化的那個類,那么 static 代表的就是那個類。
~~~php
<?php
class A {
static public function get_self() {
return new self();
}
static public function get_static() {
return new static();
}
}
class B extends A { }
echo get_class(A::get_self());//A
echo get_class(A::get_static()); // A
echo get_class(B::get_self()); // A: 實例化B::get_self()對象里面的self()所在哪個類,就返回哪個類。
echo get_class(B::get_static()); // B: 訪問的是當前類,有點像this; 因為其是B繼承了的get_static方法,而調用的。
~~~
>[info] 由此可見,他們的區別只有在繼承中才能體現出來,如果沒有任何繼承,那么這兩者是沒有區別的。但如果是在靜態方法內new本類的話,最好還是用new static();
- 現代化PHP特性
- php7常用特性整理
- 反射機制Reflection
- 依賴注入與服務容器
- 抽象類與接口
- 類多繼承的替代方案Traits
- 類的延遲綁定(后期綁定)
- 生成器語法
- 匿名函數和閉包
- 匿名類
- 理解php的output buffer
- 斷言ASSERT
- 魔術方法小結
- Zend Opcache字節碼緩存
- 內置的http服務器
- SPL標準庫
- 【SPL標準庫專題(1)】SPL簡介
- 【SPL標準庫專題(2)】Iterator
- 【SPL標準庫專題(3)】Classes
- 【SPL標準庫專題(4)】Exceptions
- 【SPL標準庫專題(5)】Datastructures:SplDoublyLinkedList
- 【SPL標準庫專題(6)】Datastructures:SplStack & SplQueue
- 【SPL標準庫專題(7)】Datastructures:SplPriorityQueue
- 【SPL標準庫專題(8)】Datastructures:SplHeap & SplMaxHeap & SplMinHeap
- 【SPL標準庫專題(9)】Datastructures:SplFixedArray
- 【SPL標準庫專題(10)】Datastructures:SplObjectStorage
- PHPcomposer使用手札[ing]
- PHP中的多態
- 通過命名空間實現自動加載的框架雛形
- 日期與金額
- PHPstorm使用攻略
- 筆記本