PHP面向?qū)ο蟪绦蛟O(shè)計中的self、static、parent關(guān)鍵字用法分析
本文實例講述了PHP面向?qū)ο蟪绦蛟O(shè)計中的self、static、parent關(guān)鍵字用法.分享給大家供大家參考,具體如下:
看到php里面有關(guān)于后期靜態(tài)綁定的內(nèi)容,雖然沒有完全看懂,但是也收獲不少東西。
php官方手冊介紹:
http://php.net/manual/zh/language.oop5.late-static-bindings.php
不存在繼承的時候
不存在繼承的意思就是,就書寫一個單獨的類來使用的時候。self和static在范圍解析操作符 (::) 的使用上,并無區(qū)別。
- 在靜態(tài)函數(shù)中,self和static可以調(diào)用靜態(tài)屬性和靜態(tài)函數(shù)(沒有實例化類,因此不能調(diào)用非靜態(tài)的屬性和函數(shù))。
- 在非靜態(tài)函數(shù)中,self和static可以調(diào)用靜態(tài)屬性和靜態(tài)函數(shù)以及非靜態(tài)函數(shù)
此時,self和static的表現(xiàn)是一樣的,可以替換為該類名::的方式調(diào)用。
<?php class Demo{ public static $static; public $Nostatic; public function __construct(){ self::$static = "static"; $this->Nostatic = "Nostatic"; } public static function get(){ return __CLASS__; } public function show(){ return "this is function show with ".$this->Nostatic; } public function test(){ echo Demo::$static."<br/>"; //使用類名調(diào)用靜態(tài)屬性 echo Demo::get()."<br/>"; //使用類名調(diào)用靜態(tài)屬性 echo Demo::show()."<br/>"; //使用類名調(diào)用靜態(tài)屬性 echo self::$static."<br/>"; //self調(diào)用靜態(tài)屬性 echo self::show()."<br/>"; //self調(diào)用非靜態(tài)方法 echo self::get()."<br/>"; //self調(diào)用靜態(tài)方法 echo static::$static."<br/>";//static調(diào)用靜態(tài)屬性 echo static::show()."<br/>";//static調(diào)用非靜態(tài)方法 echo static::get()."<br/>"; //static調(diào)用靜態(tài)方法 } } $obj = new Demo(); $obj->test();
輸出結(jié)果:
static
Demo
this is function show with Nostatic
static
this is function show with Nostatic
Demo
static
this is function show with Nostatic
Demo
繼承的時候
在繼承時,self和static在范圍解析操作符 (::) 的使用上有差別。parent也是在繼承的時候使用的。
<?php class A{ static function getClassName(){ return "this is class A"; } static function testSelf(){ echo self::getClassName(); } static function testStatic(){ echo static::getClassName(); } } class B extends A{ static function getClassName(){ return "this is class B"; } } B::testSelf(); echo "<br/>"; B::testStatic();
輸出結(jié)果:
this is class A
this is class B
self調(diào)用的靜態(tài)方法或?qū)傩允冀K表示其在使用的時候的當前類(A)的方法或?qū)傩?,可以替換為其類名,但是在類名很長或者有可能變化的情況下,使用self::的方式無疑是更好的選擇。
static調(diào)用的靜態(tài)方法或?qū)傩詴诶^承中被其子類重寫覆蓋,應(yīng)該替換為對應(yīng)的子類名(B)。
parent關(guān)鍵字用于調(diào)用父類的方法和屬性。在靜態(tài)方法中,可以調(diào)用父類的靜態(tài)方法和屬性;在非靜態(tài)方法中,可以調(diào)用父類的方法和屬性。
<?php class A{ public static $static; public $Nostatic; public function __construct(){ self::$static = "static"; $this->Nostatic = "Nostatic"; } public static function staticFun(){ return self::$static; } public function noStaticFun(){ return "this is function show with ".$this->Nostatic; } } class B extends A{ static function testS(){ echo parent::staticFun(); } function testNoS(){ echo parent::noStaticFun(); } } $obj = new B(); $obj->testS(); echo "<br/>"; $obj->testNoS();
輸出結(jié)果
static
this is function show with Nostatic
在文章的最后,我們分析一個手冊上的例子
<?php 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(); ?>
輸出結(jié)果
A
C
C
我們單獨拿出test方法進行分析:
public static function test() { A::foo(); parent::foo(); self::foo(); }
1)A::foo();
這個語句是可以在任何地方執(zhí)行的,它表示使用A去調(diào)用靜態(tài)方法foo()得到'A'。
2)parent::foo();
C的parent是B,B的parent是A,回溯找到了A的foo方法;static::who();
語句中的static::調(diào)用的方法會被子類覆蓋,所以優(yōu)先調(diào)用C的who()方法,如果C的who方法不存在會調(diào)用B的who方法,如果B的who方法不存在會調(diào)用A的who方法。所以,輸出結(jié)果是'C'。[注1]
3)self::foo();
這個self::是在B中使用的,所以self::等價于B::,但是B沒有實現(xiàn)foo方法,B又繼承自A,所以我們實際上調(diào)用了A::foo()
這個方法。foo方法使用了static::who()
語句,導致我們又調(diào)用了C的who函數(shù)。[注2]
<?php 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(); ?>
輸出結(jié)果:
A B B
<?php 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 foo() { echo "fooB"."\n"; } public static function who() { echo __CLASS__."\n"; } } class C extends B { public static function foo() { echo "fooC"."\n"; } public static function who() { echo __CLASS__."\n"; } } C::test(); ?>
輸出結(jié)果:
A C fooB
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計有所幫助。
相關(guān)文章
解決php的“It is not safe to rely on the system’s timezone setti
這篇文章主要介紹了解決php的“It is not safe to rely on the system’s timezone settings”問題的方法,需要的朋友可以參考下2015-10-10淺析php fwrite寫入txt文件的時候用 \r\n不能換行的問題
以下是對php中fwrite寫入txt文件的時候用 \r\n不能換行的問題進行了介紹,需要的朋友可以過來參考下2013-08-08php實現(xiàn)登錄tplink WR882N獲取IP和重啟的方法
這篇文章主要介紹了php實現(xiàn)登錄tplink WR882N獲取IP和重啟的方法,涉及php基于curl的登陸及數(shù)據(jù)傳輸相關(guān)技巧,需要的朋友可以參考下2016-07-07mysql_escape_string()函數(shù)用法分析
這篇文章主要介紹了mysql_escape_string()函數(shù)用法,結(jié)合實例形式講述了mysql_escape_string()函數(shù)的功能,并分析了mysql_escape_string的使用技巧與注意事項,需要的朋友可以參考下2016-04-04PHP 無限分類三種方式 非函數(shù)的遞歸調(diào)用!
今天分享下自己學習細說php中的無限分類方法。學習php的朋友可以參考下。2011-08-08PHP配合微信小程序?qū)崿F(xiàn)獲取手機號碼詳解
這篇文章主要為大家詳細介紹了PHP如何配合微信小程序?qū)崿F(xiàn)獲取手機號碼功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2022-08-08