您好,登錄后才能下訂單哦!
PHP中有一些幾乎不會關注和關心的‘細枝末節’。
如果你敢說你精通PHP,不了解這個系列就算不得什么精通。也就應該繼續了解以下內容。
第一篇 new self() 和 new static()
1 . new self()
self的用法有
1》引用類常量
class A{ const DATELINE = '20170101'; public function check_newyear(){ return (@date('Ymd') >= self::DATELINE); } } var_dump((new A)->check_newyear());//bool(true)
2》引用類靜態方法
class A{ const DATELINE = '20170101'; public function check_newyear(){ return self::is_newyear(); } public static function is_newyear(){ return (@date('Ymd') >= self::DATELINE); } } var_dump((new A)->check_newyear());//bool(true)
3》引用非靜態方法(不推薦)
class A{ const DATELINE = '20170101'; public function check_newyear(){ return self::is_newyear(); } public function is_newyear(){ return (@date('Ymd') >= self::DATELINE); } }
self 完全等同于self所在 類名
self 完全可以用當前類 類名 替代
class A{ const AGE = 1; public function test(){ return self::AGE; } } class B extends A{ const AGE = 2; } var_dump((new B)->test());//int(1) //-------------------------------- class A{ const AGE = 1; public function test(){ return self::AGE; } } class B extends A{ const AGE = 2; public function test(){ return self::AGE; } } var_dump((new B)->test());//int(2)
以上倆段代碼可以驗證這一點。
由此類推如下代碼就簡單了:
class A{ public function instance(){ return new self(); } } var_dump((new A)->instance()); //可替代為 class A{ public function instance(){ return new A(); } } var_dump((new A)->instance());
class A{ public function instance(){ return new self(); } } class B extends A{ public function instance(){ return new self(); } } var_dump((new B)->instance()); //可替代為 class A{ public function instance(){ return new A(); } } class B extends A{ public function instance(){ return new B(); } } var_dump((new B)->instance());
2. new static()
static的用法
1》方法靜態變量
function f1(){ static $a; $a++; var_dump($a); } function f2(){ static $a; $a += 10; var_dump($a); } f1();//1 f1();//2 f1();//3 f2();//10 f2();//20 f2();//30
方法里的靜態變量屬于方法,作用域也指向當前方法。
2》類靜態屬性
class A{ public static $name = 'zhangsan'; public function test(){ return self::$name; } } var_dump((new A)->test());
3》類靜態方法
class A{ public static $name = 'zhangsan'; public static function test(){ return self::$name; } } var_dump((new A)->test());
附錯誤例
//Error1 //$name 為非靜態變量 class A{ public $name = 'zhangsan'; public static function test(){ return self::$name; } } //Error2 //靜態方法內存在$this class A{ public $name = 'zhangsan'; public static function test(){ return $this->name; } }
而我們知道,靜態屬性屬于類本身,所以靜態對象也存在繼承。
class A{ public static $name = 'zhangsan'; public function test(){ return self::$name; } } class B extends A{ public function test(){ return self::$name; } } var_dump((new B)->test());//zhangsan
在繼承中static是動態的
class A{ public static $name = 'zhangsan'; public static function test(){ return self::$name; } public static function test1(){ return static::$name; } } class B extends A { public static $name = "lisi"; } var_dump(A::test1()); //zhangsan; var_dump(B::test1()); //lisi;
其實, static 是 self 的補充。
3 . new self() 和 new static() 的不同
class A{ public static $name = 'zhangsan'; public function test(){ return new self(); } public function test1(){ return new static(); } } class B extends A { } var_dump((new A)->test()); //A; var_dump((new A)->test1()); //A; var_dump((new B)->test()); //A; var_dump((new B)->test1()); //B;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。