雖然接觸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
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()方法。對象
因此上面代碼輸出爲: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 對當前類自己的一個引用