php面向對象的簡單總結 $this $parent self
雖然接觸php比較長時間,但有時在使用一些基礎東西的時候還會有些不確定,有些疑惑。面向對象涉及到的比較多,大概總結整理一下php的屬性、對象,以及訪問方式$this $parent self 的使用場景。
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();
總結幾點:
在實例化對象時 $otestClass = new testClass(); 其中testClass()中的()可以省略,當構造函數有顯式聲明需要參數時,需要在這裡傳入參數
如果被引用的變量或者方法被聲明成const(定義常量)或者static(聲明靜態),那麼就必須使用操作符::
如果被引用的變量或者方法沒有被聲明成const或者static,那麼就必須使用操作符->
從類的內部訪問const或者static變量或者方法,使用自引用的self
從類的內部訪問不為const或者static變量或者方法,使用自引用的$this
2. $this-> 究竟指向哪?
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->方法() 的例子:
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()方法。
如果在類中用$this調用一個當前類中不存在的方法或變量,它會依次去父類尋找,直到找不到再報錯
基於第一條,如果找到了需要的方法或變量,就會停止尋找,如果其上級父類中還有同樣的,則選擇當前找到的
所以上面代碼輸出為:
frank
I`m the up
3. 關於parent::
parent是對父類的引用
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 對當前類本身的一個引用