詳解PHP中abstract(抽象)、final(最終)和static(靜態(tài))原理與用法

發(fā)布時(shí)間:2024-03-13
本文實(shí)例講述了php中abstract(抽象)、final(最終)和static(靜態(tài))原理與用法。分享給大家供大家參考,具體如下:
abstract(抽象)
php 5 支持抽象類和抽象方法。定義為抽象的類不能被實(shí)例化。任何一個(gè)類,如果它里面至少有一個(gè)方法是被聲明為抽象的,那么這個(gè)類就必須被聲明為抽象的。被定義為抽象的方法只是聲明了其調(diào)用方式(參數(shù)),不能定義其具體的功能實(shí)現(xiàn)。
繼承一個(gè)抽象類的時(shí)候,子類必須定義父類中的所有抽象方法;另外,這些方法的訪問控制必須和父類中一樣(或者更為寬松)。例如某個(gè)抽象方法被聲明為受保護(hù)的,那么子類中實(shí)現(xiàn)的方法就應(yīng)該聲明為受保護(hù)的或者公有的(嚴(yán)格程度:private>protected>public),而不能定義為私有的。此外方法的調(diào)用方式必須匹配,即類型和所需參數(shù)數(shù)量必須一致。例如,子類定義了一個(gè)可選參數(shù),而父類抽象方法的聲明里沒有,則兩者的聲明并無沖突。 這也適用于 php 5.4 起的構(gòu)造函數(shù)。在 php 5.4 之前的構(gòu)造函數(shù)聲明可以不一樣的。
相關(guān)學(xué)習(xí)推薦:php編程從入門到精通
總結(jié):
抽象類不能被實(shí)例化;
類中有任何抽象方法那這個(gè)類也必須為抽象的;
抽象類只能申明調(diào)用方式和參數(shù),不能定義具體功能實(shí)現(xiàn);
繼承抽象類的子類必須實(shí)現(xiàn)抽象類的所有抽象方法;
子類中實(shí)現(xiàn)的抽象方法的訪問控制必須比父類的訪問控制更嚴(yán)格;
子類中實(shí)現(xiàn)的方法的調(diào)用方式及參數(shù)數(shù)量必須與被實(shí)現(xiàn)的方法一致。
例:
<?phpabstract class abstractclass{ // 強(qiáng)制要求子類定義這些方法,不定義功能實(shí)現(xiàn) abstract protected function getvalue(); abstract protected function prefixvalue($prefix); // 普通方法(非抽象方法),子類可以不重寫 public function printout() { print $this->getvalue() . "\\\\n"; }}class concreteclass1 extends abstractclass{ protected function getvalue() { return "concreteclass1"; } public function prefixvalue($prefix) { return "{$prefix}concreteclass1"; }}class concreteclass2 extends abstractclass{ //訪問方式可以更寬松 public function getvalue() { return "concreteclass2"; } public function prefixvalue($prefix) { return "{$prefix}concreteclass2"; }}$class1 = new concreteclass1;$class1->printout();echo $class1->prefixvalue('foo_') ."\\\\n";$class2 = new concreteclass2;$class2->printout();echo $class2->prefixvalue('foo_') ."\\\\n";?><?phpabstract class abstractclass{ // 我們的抽象方法僅需要定義需要的參數(shù) abstract protected function prefixname($name);}class concreteclass extends abstractclass{ // 我們的子類可以定義父類簽名中不存在的 可選參數(shù) public function prefixname($name, $separator = ".") { if ($name == "pacman") { $prefix = "mr"; } elseif ($name == "pacwoman") { $prefix = "mrs"; } else { $prefix = ""; } return "{$prefix}{$separator} {$name}"; }}$class = new concreteclass;echo $class->prefixname("pacman"), "\\\\n";echo $class->prefixname("pacwoman"), "\\\\n";?>final
如果父類中的方法被聲明為 final,則子類無法覆蓋該方法。如果一個(gè)類被聲明為 final,則不能被繼承。
這個(gè)比較好理解,不做贅述
static
聲明類屬性或方法為靜態(tài),就可以不實(shí)例化類而直接訪問。靜態(tài)屬性不能通過一個(gè)類已實(shí)例化的對(duì)象來訪問(但靜態(tài)方法可以)。
為了兼容 php 4,如果沒有指定訪問控制,屬性和方法默認(rèn)為公有。
由于靜態(tài)方法不需要通過對(duì)象即可調(diào)用,所以偽變量 $this 在靜態(tài)方法中不可用。
靜態(tài)屬性不可以由對(duì)象通過 -> 操作符來訪問。
用靜態(tài)方式調(diào)用一個(gè)非靜態(tài)方法會(huì)導(dǎo)致一個(gè) e_strict 級(jí)別的錯(cuò)誤。
就像其它所有的 php 靜態(tài)變量一樣,靜態(tài)屬性只能被初始化為文字或常量,不能使用表達(dá)式。所以可以把靜態(tài)屬性初始化為整數(shù)或數(shù)組,但不能初始化為另一個(gè)變量或函數(shù)返回值,也不能指向一個(gè)對(duì)象。
自 php 5.3.0 起,可以用一個(gè)變量來動(dòng)態(tài)調(diào)用類。但該變量的值不能為關(guān)鍵字 self,parent 或 static。
總結(jié):
靜態(tài)方法無需實(shí)例化,可直接訪問;
類實(shí)例化的對(duì)象無法訪問類中的靜態(tài)屬性,但是可以訪問靜態(tài)方法;
偽變量 $this 在靜態(tài)方法中不可用;
靜態(tài)屬性不可以由對(duì)象通過 -> 操作符來訪問;
用靜態(tài)方式調(diào)用一個(gè)非靜態(tài)方法會(huì)導(dǎo)致一個(gè) e_strict 級(jí)別的錯(cuò)誤;
靜態(tài)屬性只能被初始化為文字或常量,不能使用表達(dá)式(函數(shù)返回值/寧一個(gè)變量/對(duì)象);
可以用一個(gè)變量來動(dòng)態(tài)調(diào)用類。但該變量的值不能為關(guān)鍵字 self,parent 或 static。
<?phpclass foo{ public static $my_static = 'foo'; public function staticvalue() { return self::$my_static; }}class bar extends foo{ public function foostatic() { return parent::$my_static; }}print foo::$my_static . "\\\\n";$foo = new foo();print $foo->staticvalue() . "\\\\n";print $foo->my_static . "\\\\n"; // undefined "property" my_static print $foo::$my_static . "\\\\n";$classname = 'foo';print $classname::$my_static . "\\\\n"; // as of php 5.3.0print bar::$my_static . "\\\\n";$bar = new bar();print $bar->foostatic() . "\\\\n";?> </programlisting> </example> <example> <title>靜態(tài)方法示例</title> <programlisting role="php"><![cdata[<?phpclass foo { public static function astaticmethod() { // ... }}foo::astaticmethod();$classname = 'foo';$classname::astaticmethod(); // 自 php 5.3.0 起?>
更多關(guān)于云服務(wù)器,域名注冊(cè),
上一個(gè):電腦讀取三菱PLC數(shù)據(jù)簡單方法
下一個(gè):五色梅葉枯線蟲病防治

35kV及以下電壓交流系統(tǒng)的電力電纜芯數(shù)的選擇原則有哪些?
杉木壯苗的培育
RC-1210K1152FT在線查庫存,今日?qǐng)?bào)價(jià)
租賃合同到期,租戶不搬走怎么處理
油電混合汽車十大排名(油電混合車型排名)
無期徒刑限制減刑什么意思
云服務(wù)器活動(dòng)1折搶購教程
wps怎么刪除一整頁 wps怎么刪除多余頁面
國債的品種可以按什么分類
如何隱藏文件夾中的表格,關(guān)于對(duì)文件夾和excel表格的隱藏問題
十八禁 网站在线观看免费视频_2020av天堂网_一 级 黄 色 片免费网站_绝顶高潮合集Videos