| 存取目標 | 類別外部 | 類別內部 |
|---|---|---|
| 靜態屬性/方法、常數 | ClassName::$staticPropClassName::CONST_NAME | self::$staticPropself::CONST_NAME |
| 實例屬性/方法 | $obj->prop$obj->method() | $this->prop$this->method() |
用於非靜態屬性與方法。$this 代表當前實例物件。
<?php
class TestThis {
private $content;
public function __construct($content) {
$this->content = $content; // 設定實例屬性
}
public function printContent() {
echo $this->content . '<br>'; // 讀取實例屬性
}
}
$obj = new TestThis('歡迎來到 PHP 世界!');
$obj->printContent(); // 輸出: 歡迎來到 PHP 世界!
用於 static 屬性/方法、const 常數。亦用於呼叫父類別方法(parent::)。
class ClassA {
const PI = 3.14; // 常數不加 $ 符號
private static $name = 'Static Class A';
public $value = 'instance';
public static function getName() {
return self::$name; // 正確:存取靜態屬性
}
// 錯誤:靜態方法不可存取非靜態屬性
// public static function getValue() { return self::$value; }
public function getPI() {
return self::PI; // 實例方法存取常數
}
}
echo ClassA::PI; // 3.14
echo ClassA::getName(); // Static Class A
class ParentClass {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
class ChildClass extends ParentClass {
public $gender, $age;
public function __construct($gender, $age) {
parent::__construct('NoStop'); // 呼叫父類別建構子
$this->gender = $gender;
$this->age = $age;
}
public function printInfo() {
echo "{$this->name}是個{$this->gender},今年{$this->age}歲<br>";
}
}
$obj = new ChildClass('女性', 22);
$obj->printInfo(); // NoStop是個女性,今年22歲
self:代表當前類別(靜態綁定),用於存取靜態成員、常數$this:代表當前實例物件,用於存取實例屬性、方法static(PHP 5.3+):晚期靜態綁定,代表實際被呼叫的類別靜態方法不可直接存取非靜態屬性($this 在靜態語境中不可用):
class Demo {
public static $staticProp = 'static';
public $instanceProp = 'instance';
public static function staticMethod() {
echo self::$staticProp; // 正確
// echo $this->instanceProp; // 錯誤:Using $this when not in object context
}
public function instanceMethod() {
echo self::$staticProp; // 正確
echo $this->instanceProp; // 正確
}
}
MAX_SIZE)parent::method() 而非 ParentClass::method(),支援繼承鏈重構