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