在網(wǎng)站建設(shè)中,PHP 5開始引入了新的對(duì)象模型。完全重寫了PHP處理對(duì)象的方式,允許更佳性能和更多特性。本節(jié)將重點(diǎn)介紹PHP類和對(duì)象的定義和應(yīng)用,以幫助用戶掌握強(qiáng)大的對(duì)象化編程開發(fā)的方法和技巧。
定義和調(diào)用類
使用class關(guān)鍵字可以定義類,在類中可以聲明類成員和方法。例如,在下面示例中定義了類A,該類中包含一個(gè)方法f()。
<?phpclass A{ function f(){ echo "類方法"; }}?>
在類中,偽變量$this是一個(gè)對(duì)調(diào)用對(duì)象的引用,即引用類的實(shí)例。再看一個(gè)示例,在這個(gè)示例中分別聲明了類成員和方法。
<?phpclass A{ public $var = '默認(rèn)值'; //聲明成員 public function f(){ //聲明方法 echo $this->var; }}?>
使用new關(guān)鍵字可以調(diào)用類,即使用new關(guān)鍵字創(chuàng)建一個(gè)對(duì)象的實(shí)例,然后就可以引用類成員和方法了。如:
<?php$a = new A(); //實(shí)例化類echo $a->var; //引用對(duì)象的成員,顯示'默認(rèn)值'$a->f(); //引用對(duì)象的方法,顯示'默認(rèn)值'?>
當(dāng)把一個(gè)對(duì)象已經(jīng)創(chuàng)建的實(shí)例賦給一個(gè)新變量時(shí),新變量會(huì)訪問同一個(gè)實(shí)例,就和用該對(duì)象賦值一樣。此行為和給函數(shù)傳遞入實(shí)例時(shí)一樣??梢杂每寺〗o一個(gè)已創(chuàng)建的對(duì)象建立一個(gè)新實(shí)例。在一個(gè)類中可以使用extends關(guān)鍵字繼承另一個(gè)類的方法和成員。但不能擴(kuò)展多個(gè)類,只能繼承一個(gè)基類。例如,在下面示例中,分別定義A和B類,其中A是基類,B是子類,然后就可以在B類中調(diào)用基類的成員或者方法。
<?phpclas A{ //定義A類 public $var = '默認(rèn)值'; //聲明成員public function f(){ //聲明方法 echo $this->var; }}clas B extends A{ //定義B類 function e() { //聲明方法 parent::f(); //調(diào)用A類的方法f() }}$b = new B(); //實(shí)例化B類$b->e(); //調(diào)用對(duì)象$b的e()方法,顯示'默認(rèn)值'
類屬性
類的變量成員被稱為屬性,或者字段、特征,本書統(tǒng)一稱為屬性。屬性聲明是由關(guān)鍵字public、protected或者private開頭,然后跟一個(gè)變量來組成。屬性中的變量可以初始化,但是初始化的值必須是常數(shù),這里的常數(shù)是指在編譯階段時(shí)就為常數(shù),而不是在編譯階段之后在運(yùn)行階段運(yùn)算出的常數(shù)。
類成員都必須使用關(guān)鍵字public、protected或private進(jìn)行定義。由public關(guān)鍵字定義的類成員可以在任何地方被訪問。由protected定義的類成員可以被其所在類的子類和父類訪問,當(dāng)然該成員所在的類也可以訪問。由private定義的類成員則只能被其所在類訪問。
為了兼容PHP 4,PHP 5聲明屬性依然可以直接使用關(guān)鍵字var,或者放在public、protected、private之前。但是var并不是必需的。如果直接使用var聲明屬性,而沒有public、protected或pri-vate,PHP 5會(huì)認(rèn)為這個(gè)屬性為public。
在類的成員方法里面,可以通過$this->property(property是屬性名字)這種方式來訪問類的屬性、方法,但是要訪問類的靜態(tài)屬性或者在靜態(tài)方法里面卻不能使用,而是使用self::$property。在類的非靜態(tài)方法里面可以使用偽變量$this,這個(gè)偽變量是調(diào)用該方法的實(shí)例化對(duì)象引用。
<?phpclass MyClass{ public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; }}$obj = new MyClass();echo $obj->public; //正常執(zhí)行,顯示:publicecho $obj->protected; //會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤echo $obj->private; //會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤$obj->printHello(); //輸出:public、protected和private?>
類常量
在類中還可以定義常量,常量的值將始終保持不變,常量的值必須是一個(gè)定值,不能是變量、類屬性或其他操作(如函數(shù)調(diào)用)的結(jié)果。在定義和使用常量時(shí)不需要使用$符號(hào),常量的值不能為關(guān)鍵字self、parent或static。例如,在下面示例中定義并使用一個(gè)類常量。
<?phpclass MyClass{ const constant = '常量值'; //聲明類常量 function showConstant() { echo self:constant ."\n"; //在類方法中引用常量 }}echo MyClass::constant . "\n"; //直接讀取類常量$class = new MyClass();$class->showConstant(); //調(diào)用類的方法顯示常量值?>