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

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

Jul 08, 2017 am 10:15 AM
parent self this

{一}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- >name ),那麼當然輸出了"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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1426
52
Laravel 教程
1328
25
PHP教程
1273
29
C# 教程
1253
24
為什麼NameResolutionError(self.host, self, e) from e,怎麼解決 為什麼NameResolutionError(self.host, self, e) from e,怎麼解決 Mar 01, 2024 pm 01:20 PM

報錯的原因NameResolutionError(self.host,self,e)frome是由urllib3函式庫中的例外類型,這個錯誤的原因是DNS解析失敗,也就是說,試圖解析的主機名稱或IP位址無法找到。這可能是由於輸入的URL位址不正確,或DNS伺服器暫時無法使用所導致的。如何解決解決此錯誤的方法可能有以下幾種:檢查輸入的URL地址是否正確,確保它是可訪問的確保DNS伺服器可用,您可以嘗試在命令行中使用"ping"命令來測試DNS伺服器是否可用嘗試使用IP位址而不是主機名稱來存取網站如果是在代理

Python中的self怎麼使用 Python中的self怎麼使用 May 17, 2023 pm 10:40 PM

在介紹Python的self用法之前,先來介紹下Python中的類別和實例我們知道,物件導向最重要的概念就是類別(class)和實例(instance),類別是抽象的模板,例如學生這個抽象的事物,可以用一個Student類別來表示。而實例是根據類別創建出來的一個個具體的“物件”,每個物件都從類別中繼承有相同的方法,但各自的資料可能不同。 1.以Student類別為例,在Python中,定義類別如下:classStudent(object):pass(Object)表示該類別從哪個類別繼承下來的,Object類別是所有

聊聊Vue2為什麼能透過this存取各種選項中屬性 聊聊Vue2為什麼能透過this存取各種選項中屬性 Dec 08, 2022 pm 08:22 PM

這篇文章帶大家解讀vue原始碼,來介紹一下Vue2中為什麼可以使用 this 存取各種選項中的屬性,希望對大家有幫助!

如何在Python中存取父類別屬性? 如何在Python中存取父類別屬性? Aug 26, 2023 am 10:17 AM

在物件導向程式設計中,繼承允許我們創建繼承現有類別的屬性和方法的新類別。這個強大的概念可以在我們的程式中實現程式碼重複使用、模組化和可擴展性。在深入研究存取父類別屬性之前,讓我們先了解一下

一篇搞懂this指向,追趕70%的前端人 一篇搞懂this指向,追趕70%的前端人 Sep 06, 2022 pm 05:03 PM

同事因為this指向的問題卡住的bug,vue2的this指向問題,使用了箭頭函數,導致拿不到對應的props。當我跟他介紹的時候他竟然不知道,隨後也刻意的看了一下前端交流群,至今最起碼還有70%以上的前端程式設計師搞不明白,今天給大家分享一下this指向,如果啥都沒學會,請給我一個大嘴巴子。

使用this關鍵字的巧妙方式在jQuery中 使用this關鍵字的巧妙方式在jQuery中 Feb 25, 2024 pm 04:09 PM

jQuery中this關鍵字的靈活運用在jQuery中,this關鍵字是一個非常重要且靈活的概念,它用來引用目前正在操作的DOM元素。透過合理的運用this關鍵字,我們可以方便地操作頁面中的元素,實現各種互動效果和功能。本文將結合具體的程式碼範例,介紹this關鍵字在jQuery中的靈活運用。簡單的this範例首先,我們來看一個簡單的this範例。假設我們有一

什麼是this?深入解析JavaScript中的this 什麼是this?深入解析JavaScript中的this Aug 04, 2022 pm 05:02 PM

什麼是this?以下這篇文章跟大家介紹一下JavaScript中的this,並聊聊this在函數不同呼叫方式下的區別,希望對大家有所幫助!

JavaScript如何改變this指向?三種方法淺析 JavaScript如何改變this指向?三種方法淺析 Sep 19, 2022 am 09:57 AM

JavaScript如何改變this指向?以下這篇文章跟大家介紹一下JS改變this指向的三種方法,希望對大家有幫助!

See all articles