php面向對象的簡單總結 $this $parent self

  雖然接觸php比較長時間,但有時在使用一些基礎東西的時候還會有些不肯定,有些疑惑。面向對象涉及到的比較多,大概總結整理一下php的屬性、對象,以及訪問方式$this  $parent  self  的使用場景。php

1. PHP類屬性定義和訪問方式:函數

 1 <?php
 2 class testClass {
 3     const tConst = 1;
 4     public $tVar = 2;    //或 public $tVar;  前面須要有變量修飾符
 5     static $tSta = 3;
 6 
 7     public function __construct(){
 8         echo $this->tConst;    //無錯誤,無輸出
 9         echo self::tConst;    //正確輸出 1
10         
11         echo $this->tVar;    // 注意tVar前不能有$符號
12         echo self::$tVar;    // Access to undeclared static property: testClass::$tVar
13         echo self::tVar;    // tVar前須要加上$符號,Undefined class constant 'tVar'
14         
15         echo $this->tSta;    //無錯誤,無輸出
16         echo self::$tSta;    //正確輸出 3
17         
18     }
19 }
20 
21 $otestClass = new testClass();

 

 

總結幾點:this

  1. 在實例化對象時  $otestClass = new testClass(); 其中testClass()中的()能夠省略,當構造函數有顯式聲明須要參數時,須要在這裏傳入參數
  2. 若是被引用的變量或者方法被聲明成const(定義常量)或者static(聲明靜態),那麼就必須使用操做符::
  3. 若是被引用的變量或者方法沒有被聲明成const或者static,那麼就必須使用操做符->
  4. 從類的內部訪問const或者static變量或者方法,使用自引用的self
  5. 從類的內部訪問不爲const或者static變量或者方法,使用自引用的$this

2. $this->  究竟指向哪?spa

 1 class testClass {
 2     var $nick = '';
 3     
 4     public function __construct($nick){
 5         $this->nick = $nick;
 6     }
 7     
 8     public function display(){
 9         echo $this->nick;
10     }
11 }
12 
13 $otestClass1 = new testClass('frank');
14 $otestClass1->display();        //echo $otestClass1->nick;  和此結果相同

 

上面例子中,$this->display();   其實就是 $otestClass1->nick,所以$this究竟指向哪是由所實例化的對象決定的,指向當前對象實例的指針。包括變量、方法都是如此指針

$this->方法() 的例子:code

 1 class baseClass{
 2     public function testFunc(){
 3         echo "\n" . 'I`m boss';
 4     }
 5 }
 6 
 7 class parentClass extends baseClass{
 8     public function testFunc(){
 9         echo "\n" . 'I`m the up';
10     }
11 }
12 
13 class testClass extends parentClass{
14     var $nick = '';
15     
16     public function __construct($nick){
17         $this->nick = $nick;
18     }
19     
20     public function display(){
21         echo $this->nick;
22         $this->testFunc();
23     }
24 }
25 
26 $otestClass1 = new testClass('frank');
27 $otestClass1->display();

 

這樣的代碼最後的輸出結果是什麼呢?關鍵是看testFunc()方法。對象

  1. 若是在類中用$this調用一個當前類中不存在的方法或變量,它會依次去父類尋找,直到找不到再報錯
  2. 基於第一條,若是找到了須要的方法或變量,就會中止尋找,若是其上級父類中還有一樣的,則選擇當前找到的

因此上面代碼輸出爲:blog

frank
I`m the up

 

3. 關於parent::繼承

parent是對父類的引用io

 1 <?php
 2 class A {
 3     public  $a = 'aa';
 4     public function callFunc(){
 5         echo 'parent';
 6     }
 7 }
 8 
 9 class B extends A{
10     public function __construct(){
11         parent::callFunc();
12         echo "\n" . $this->a;
13     }
14 }
15 
16 $oB = new B;

好比,上面的代碼中,在class B中,若要調用其父類A中的callFunc()方法,就須要使用parent::callFunc(),但A類中此方法必須是public修飾的,不然會提示 Fatal error: Call to private method A::callfunc() from context 'B'...

另外須要注意的是,對於父類中的屬性$a,調用的時候用$this,用parent就訪問不到了。若$a在A類中是這樣定義的:public static $a,則訪問的時候就須要parent::$a

注意,parent不具有傳遞性,它只能表明當前類的父類,若此例子A類繼承base類,在base類中定義baseFunc()方法,那麼在B類中使用parent::baseFunc()是錯誤的,只能在A類中這樣使用。

4. self::又指向哪裏?

簡單的說,self和某具體實例沒有關係,它只指向當前類,不會受某具體類對象的影響

 1 class testClass{
 2     public static $count = 0;
 3     public $num = 0;
 4     
 5     function __construct(){
 6         self::$count++;
 7         $this->num++;
 8     }
 9     
10     function display(){
11         echo self::$count . "\n";
12         echo $this->num . "\n";
13     }
14 }
15 
16 $oTest1 = new testClass;
17 $oTest1->display();        //輸出: 1  1
18 
19 $oTest2 = new testClass;
20 $oTest2->display();        //輸出: 2  1

上面例子中self::$cout始終指向該類自己,而$num是單獨存在於各個具體實例中的。

 

5. 總結:

  $this 指向當前的實例

  $parent 是父類的引用

  self 對當前類自己的一個引用

相關文章
相關標籤/搜索