您已經(jīng)了解了類類型提示和訪問控制如何使您更好地控制類的接口。在本章中巨朦,我將更深入地研究PHP的面向?qū)ο蠊δ堋?br>
本章將涉及幾個(gè)主題:
?靜態(tài)方法和屬性:通過類訪問數(shù)據(jù)和功能而不是對(duì)象
?抽象類和接口:將設(shè)計(jì)與實(shí)現(xiàn)分開
?特性:在類層次結(jié)構(gòu)之間共享實(shí)現(xiàn)
?錯(cuò)誤處理:引入異常
?最后的類和方法:限制繼承?攔截器方法:自動(dòng)委派
?析構(gòu)方法:清理對(duì)象后?克隆對(duì)象:制作對(duì)象副本
?將對(duì)象解析為字符串:創(chuàng)建摘要方法
?回調(diào):向具有匿名功能和類
靜態(tài)方法和屬性
上一章中的所有示例都適用于對(duì)象。我將類定義為模板產(chǎn)生了哪些對(duì)象剑令,以及哪些對(duì)象作為類的活動(dòng)實(shí)例(您使用其方法的事物)調(diào)用以及您訪問其屬性糊啡。我暗示,在面向?qū)ο蟮木幊讨杏踅颍嬲墓ぷ魇怯深惖膶?shí)例完成棚蓄。畢竟,類僅僅是對(duì)象的模板。
實(shí)際上梭依,它不是那么簡單稍算。您可以在類的上下文中訪問方法和屬性,而不是比物體的 此類方法和屬性是“靜態(tài)”的睛挚,必須使用靜態(tài)關(guān)鍵字
// listing 04.01
class StaticExample
{
static public $aNum = 0;
public static function sayHello()
{
print "hello";
}
}
靜態(tài)方法是具有類范圍的函數(shù)邪蛔。他們本身不能訪問任何常規(guī)屬性該類,因?yàn)樗鼈儗儆谝粋€(gè)對(duì)象扎狱;但是侧到,他們可以訪問靜態(tài)屬性。如果你改變一個(gè)靜態(tài)屬性淤击,該類的所有實(shí)例都可以訪問新值
由于您是通過類而非實(shí)例訪問靜態(tài)元素的匠抗,因此不需要使用引用一個(gè)對(duì)象。而是污抬,將類名與::結(jié)合使用汞贸,如本例所示
print StaticExample::$aNum;
StaticExample::sayHello();
結(jié)果:0hello
上一章應(yīng)該熟悉此語法。我與父母一起使用::覆蓋的方法∮』現(xiàn)在矢腻,和那時(shí)一樣,我正在訪問類而不是對(duì)象數(shù)據(jù)射赛。類代碼可以使用parent關(guān)鍵字可訪問超類而不使用其類名多柑。訪問靜態(tài)方法或?qū)傩栽谕粋€(gè)類(而不是孩子)中,我將使用self關(guān)鍵字楣责。之前的$ this
偽變量是對(duì)象竣灌。因此,從StaticExample類之外秆麸,我訪問$ aNum屬性使用其類名:
StaticExample::$aNum;
在StaticExample類中初嘹,我可以使用self關(guān)鍵字
// listing 04.02
class StaticExample
{
static public $aNum = 0;
public static function sayHello()
{
self::$aNum++;
print "hello (" . self::$aNum . ")\n";
}
}
注意使用父對(duì)象進(jìn)行方法調(diào)用是唯一應(yīng)使用靜態(tài)方法的情況 引用非靜態(tài)方法
除非您要訪問重寫的方法,否則應(yīng)僅使用::訪問方法或?qū)傩砸呀?jīng)明確聲明為靜態(tài)
但是沮趣,在文檔中屯烦,您經(jīng)常會(huì)看到用于引用方法或?qū)傩缘撵o態(tài)語法。這確實(shí)這并不意味著所討論的項(xiàng)目必定是靜態(tài)的兔毒,只是它屬于某個(gè)類別漫贞。在寫()ShopProductWriter類的方法可以稱為ShopProductWriter :: write(),例如育叁,即使write()方法不是靜態(tài)的迅脐。當(dāng)該特定級(jí)別為時(shí),您將在此處看到此語法適當(dāng)豪嗽。
// listing 04.02
class StaticExample
{
static public $aNum = 0;
public $an = 9;
public function sayHello()
{
self::$aNum++;
print "hello (" . self::$aNum . ")\n";
}
}
print StaticExample::$aNum;
StaticExample::sayHello();
StaticExample::sayHello();
$new=new StaticExample();
echo $new->sayHello();
$new=new StaticExample();
echo $new->sayHello();
根據(jù)定義谴蔑,靜態(tài)方法和屬性是在類而非對(duì)象上調(diào)用的豌骏。為此原因,它們通常被稱為類變量和屬性隐锭。由于這種課堂取向窃躲,您不能在靜態(tài)方法中使用$ this偽變量
那么,為什么要使用靜態(tài)方法或?qū)傩郧账快o態(tài)元素具有許多特征這可能是有用的蒂窒。首先,它們可從腳本中的任何位置使用(假設(shè)您有權(quán)訪問班級(jí))荞怒。這意味著您可以訪問功能洒琢,而無需傳遞來自的類的實(shí)例。對(duì)象到對(duì)象褐桌,或者更糟的是衰抑,將實(shí)例存儲(chǔ)在全局變量中。其次荧嵌,靜態(tài)屬性可用于類的每個(gè)實(shí)例呛踊,因此您可以設(shè)置想要供類型的所有成員使用的值。最后啦撮,您不需要實(shí)例來訪問靜態(tài)屬性或方法的事實(shí)可以使您免于實(shí)例化純粹是為了獲得簡單功能的對(duì)象