php中this,self,parent的區別講解

WBOY
發布: 2016-07-25 08:59:19
原創
845 人瀏覽過
  1. class name //建立了一個名為name的類別

  2. {
  3. private $name; //定義屬性,私有
  4. //定義建構函數,用於初始化賦值

  5. function __construct( $name )
  6. {
  7. $this->name = $name ; //這裡已經使用了this指標語句①
  8. }
  9. //析構函數

  10. function __destruct(){}
  11. / /列印使用者名稱成員函數

  12. function printname()
  13. {
  14. print( $this->name ); //再次使用了this指標語句②,也可以使用echo輸出
  15. }
  16. }
  17. $obj1 = new name( "PBPHome" ); //實例化物件語句③
  18. //執行列印

  19. $obj1->printname(); //輸出: PBPHome
  20. echo "
    "; //輸出:回車
  21. //第二次實例化物件

  22. $obj2 = new name( "PHP" ) ;
  23. //執行列印

  24. $obj2->printname(); //輸出:PHP
  25. ?>
複製程式碼

說明: 在語句①和語句②使用了this指針,那當時this是指向誰呢? 其實this是在實例化時來確定指向誰,例如第一次實例化對象的時候(語句③),那麼當時this就是指向$obj1對象,那麼執行語句②的打印時就把print( $this-> name ),那麼當然就輸出了"PBPHome"。第二個實例的時候,print( $this->name )變成了print( $obj2->name ),於是就輸出了"PHP"。所以說,this就是指向當前物件實例的指針,不指向任何其他物件或類別。

再來看下self的用法。

self是指向類別本身,也就是self是不指向任何已經實例化的對象,一般self使用來指向類別中的靜態變數。 假如使用類別裡面靜態(一般用關鍵字static)的成員,必須使用self來呼叫。 請注意,使用self來呼叫靜態變數必須使用 :: (域運算符號),請參閱實例。

  1. class counter //定義一個counter的類別

  2. {
  3. //定義屬性,包括一個靜態變量$firstCount,並賦初值0 語句①
  4. private static $firstCount = 0;
  5. private $lastCount;
  6. //構造函數

  7. function __construct()
  8. {
  9. $this->lastCount = ++self::$firstCount; //使用self來呼叫靜態變數語句②
  10. }
  11. //印出lastCount數值

  12. function printLastCount()
  13. {
  14. print( $this->lastCount );
  15. }
  16. }
  17. //實例化物件

  18. $obj = new Counter();
  19. $obj->printLastCount(); //執行到這裡的時候,程式輸出1

  20. ?>
複製程式碼

注意: 語句①和語句②。在語句①定義了一個靜態變數$firstCount,那麼在語句②時使用了self呼叫這個值,這時呼叫的就是類別自己定義的靜態變數$frestCount。 靜態變數與下面物件的實例無關,它只是跟類別有關,那麼呼叫類別本身的,那麼就無法使用this來引用,因為self是指向類別本身,與任何物件實例無關。 然後,前面使用的this呼叫的是實例化的物件$obj。

最後,我們就parent的用法進行講解。

parent是指向父類別的指針,一般使用parent來呼叫父類別的建構子。

例:

  1. //建立基類Animal

  2. class Animal
  3. {
  4. public $🎜> public $ name; //基底類別的屬性,名字$name
  5. //基底類別的建構函數,初始化賦值

  6. public function __construct( $name )
  7. {
  8. $ this->name = $name;
  9. }
  10. }
  11. //訂衍生類別Person 繼承自Animal類別

  12. class Person extends Animal
  13. {
  14. public $personSex; //對於衍生類,新定義了屬性$personSex性別、$personAge年齡
  15. public $personAge;
  16. //衍生類別的建構子

  17. function __construct ( $personSex, $personAge )
  18. {
  19. parent::__construct( "PBPHome" ); //使用parent呼叫了父類別的建構子語句①
  20. $this->personSex = $personSex;
  21. $this->personAge = $personAge;
  22. }
  23. //衍生類別的成員函數,用於列印,格式:名字is name,age is 年齡

  24. function printPerson()
  25. {
  26. print( $this->name. " is " .$this->personSex. ",age is " .$this->personAge );
  27. }
  28. }
  29. //實例化Person物件

  30. $personObject = new Person( "male", "21");
  31. //執行列印

  32. $personObject->printPerson(); //輸出結果:PBPHome is male,age is 21
  33. ?>

複製程式碼

裡面同樣含有this的用法。 細節:成員屬性都是public(公有屬性和方法,類別內部和外部的程式碼皆可存取)的,特別是父類別的,這是為了供繼承類別透過this來存取。 關鍵點在語句①: parent::__construct( "heiyeluren" ),這時使用parent來呼叫父類別的建構子進行對父類別的初始化,這樣,繼承類別的物件就都給賦值了name為PBPHome。我們可以測試下,再實例化一個物件$personObject1,執行列印後name仍然是PBPHome。

總結: this是指向物件實例的指針,在實例化的時確定指向; self是對類別本身的一個引用,一般用來指向類別中的靜態變數; parent是對父類別的引用,一般使用parent來呼叫父類別的建構子。

有了以上的理論與實例結合的介紹,你是不是已經對這三個關鍵字this,self,parent的理解,已經很深入了。 程式設計師之家,祝大家學習進步。



相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!