雖然接觸 PHP 較久,但在基礎 OOP 概念上仍易混淆。本文系統整理屬性定義、存取方式,以及 $this、parent::、self:: 的適用場景與差異。
class TestClass {
const T_CONST = 1;
public $tVar = 2;
static $tSta = 3;
public function __construct() {
echo $this->T_CONST; // 無輸出
echo self::T_CONST; // 輸出 1
echo $this->tVar; // 輸出 2
echo self::$tVar; // 錯誤:存取靜態屬性需加 $
echo self::tVar; // 錯誤:視為常數
echo $this->tSta; // 無輸出
echo self::$tSta; // 輸出 3
}
}
$obj = new TestClass();
總結:
const)與靜態屬性(static)必須用 :: 存取,搭配 self:: 或 ClassName::。-> 存取,搭配 $this->。self::,存取實例屬性/方法用 $this->。$this 永遠指向當前實例化的物件。繼承鏈中,若子類別未覆寫方法,$this->method() 會往父類別尋找,找到即停止,不會繼續往上找。
class Base { public function testFunc() { echo "I'm boss"; } }
class ParentClass extends Base { public function testFunc() { echo "I'm the up"; } }
class Child extends ParentClass {
public function display() { $this->testFunc(); }
}
$obj = new Child();
$obj->display(); // 輸出 "I'm the up"
public 或 protected 成員。$this->prop 存取;若為靜態屬性則用 parent::$prop。parent:: 存取祖父類別的成員。self:: 綁定於定義它的類別,不隨實例化物件改變。常用於靜態屬性/方法、常數。
class Counter {
public static $count = 0;
public $num = 0;
public function __construct() {
self::$count++; $this->num++;
}
public function display() { echo self::$count . "\n" . $this->num . "\n"; }
}
$o1 = new Counter(); $o1->display(); // 1, 1
$o2 = new Counter(); $o2->display(); // 2, 1
| 關鍵字 | 指向 | 適用對象 |
|---|---|---|
$this-> | 當前實例 | 非靜態屬性/方法 |
parent:: | 直接父類別 | 父類別的靜態/常數/方法 |
self:: | 目前類別定義處 | 靜態屬性/常數/靜態方法 |