首頁  >  文章  >  後端開發  >  php中this,self,parent關鍵字的區別用法詳解

php中this,self,parent關鍵字的區別用法詳解

伊谢尔伦
伊谢尔伦原創
2017-07-08 10:15:161180瀏覽

{一}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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn