{一}PHP中this,self,parent的區別之一this篇
物件導向程式設計(OOP,Object OrientedProgramming)現已成為程式設計人員的基本技能。利用OOP的想法進行PHP的高階編程,對於提升PHP編程能力和規劃web開發架構都是很有意義的。
PHP5經過重寫後,對OOP的支援額有了很大的飛躍,成為了具備了大部分物件導向語言的特性的語言,比PHP4有了很多的物件導向的特性。這裡我主要談的是this,self,parent 三個關鍵字的差別。從字面上來理解,分別是指這、自己、父親。先初步解釋一下,this是指向目前物件的指標(可以看成C裡面的指標),self是指向目前類別的指針,parent是指向父類別的指針。我們這裡經常使用指標來描述,是因為沒有更好的語言來表達。關於指針的概念,大家可以去參考百科。
下面我們就根據實際的例子結合來講講。
程式碼如下:
<?php classname //建立了一个名为name的类 { private$name; //定义属性,私有 //定义 构造函数 ,用于初始化赋值 function construct( $name ) { $this->name =$name; //这里已经使用了this指针语句① } // 析构函数 function destruct(){} //打印用户名成员函数 function printname() { print( $this->name); //再次使用了this指针语句②,也可以使用echo输出 } } $obj1 = new name("PBPHome"); //实例化对象 语句③ //执行打印 $obj1->printname(); //输出:PBPHome echo"<br>"; //输出:回车 //第二次实例化对象 $obj2 = new name( "PHP" ); //执行打印 $obj2->printname(); //输出:PHP ?>
說明:上面的類別分別在語句①和語句②使用了this指針,那麼當時this是指向誰呢?其實this是在實例化的時候來確定指向誰,比如第一次實例化對象的時候(語句③),那麼當時this就是指向$obj1對象,那麼執行語句②的打印時就把print( $this- >b3acfd40751dc6e1a0921816b2d2ab67name ),那麼當然輸出了"PBPHome"。第二個實例的時候,print($this->name )變成了print( $obj2->name),於是就輸出了"PHP"。所以說,this就是指向當前物件實例的指針,不指向任何其他物件或類別。
{二}PHP中this,self,parent的區別之二self篇
此篇我們就self的用法進行講解
首先我們要明確一點,self是指向類本身,也就是self是不指向任何已經實例化的對象,一般self使用來指向類別中的靜態變數。假如我們使用類別裡面靜態(一般用關鍵字static)的成員,也必須使用self來呼叫。也要注意使用self來呼叫靜態變數必須使用:: (域運算子號),請參閱實例。
程式碼如下:
<?php classcounter //定义一个counter的类 { //定义属性,包括一个静态变量$firstCount,并赋初值0 语句① private static $firstCount = 0; private $lastCount; //构造函数 function construct() { $this->lastCount =++self::$firstCount; //使用self来调用静态变量 语句② } //打印lastCount数值 function printLastCount() { print( $this->lastCount ); } } //实例化对象 $obj = new Counter(); $obj->printLastCount(); //执行到这里的时候,程序输出1 ?>
這裡要注意兩個地方語句①和語句②。我們在語句①定義了一個靜態變數$firstCount,那麼在語句②的時候使用了self呼叫這個值,那麼這時候我們呼叫的就是類別自己定義的靜態變數$frestCount。我們的靜態變數與下面物件的實例無關,它只是跟類別有關,那麼我呼叫類別本身的,那麼我們就無法使用this來引用,因為self是指向類別本身,與任何物件實例無關。然後前面使用的this呼叫的是實例化的物件$obj,大家不要混淆了。
關於self就說到這裡,結合例子還是比較方便理解的。第二篇結束。
{三}PHP中this,self,parent的區別之三parent篇
此我們就parent的用法進行講解。
首先,我們明確,parent是指向父類別的指針,一般我們使用parent來呼叫父類別的建構子。實例如下:
程式碼如下:
<?php //建立基类Animal class Animal { public $name; //基类的属性,名字$name //基类的构造函数,初始化赋值 public function construct( $name ) { $this->name = $name; } } //定义派生类Person 继承自Animal类 class Person extends Animal { public$personSex; //对于派生类,新定义了属性$personSex性别、$personAge年龄 public $personAge; //派生类的构造函数 function construct( $personSex, $personAge ) { parent::construct( "PBPHome"); //使用parent调用了父类的构造函数 语句① $this->personSex = $personSex; $this->personAge = $personAge; } //派生类的成员函数,用于打印,格式:名字 is name,age is 年龄 function printPerson() { print( $this->name. " is ".$this->personSex. ",age is ".$this->personAge ); } } //实例化Person对象 $personObject = new Person( "male", "21"); //执行打印 $personObject->printPerson();//输出结果:PBPHome is male,age is 21 ?>
裡面同樣含有this的用法,大家自己分析。我們注意這麼個細節:成員屬性都是public(公有屬性和方法,類別內部和外部的程式碼皆可存取)的,特別是父類別的,這是為了供繼承類別透過this來訪問。關鍵點在語句①:parent::construct( "heiyeluren"),這時候我們就使用parent來呼叫父類別的建構子進行對父類別的初始化,這樣,繼承類別的物件就都給賦值了name為PBPHome 。我們可以測試下,再實例化一個物件$personObject1,執行列印後name仍然是PBPHome。
總結:this是指向物件實例的一個指針,在實例化的時候來確定指向;self是對類別本身的一個引用,一般用來指向類別中的靜態變數;parent是對父類別的引用,一般使用parent來呼叫父類別的建構子。
以上是php中this,self,parent關鍵字的區別用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!