[PHP] $this、self與static的差別
本文最後更新於:2024年5月2日 晚上
在PHP中可以用$this
、self
、與static
代表自己這個類別
有些人可能搞不清楚他們的區別,尤其是self
、與static
但是他們各別有自己的意義和用法
在實戰中這些些微的差別可能就會造成不可預期的問題
今天我們就來仔細說明一下他們之間的差別吧
1. $this
說明:
$this
是一個特殊的變數,用於在物件方法中引用當前物件的實例- 它只能在類別的非靜態方法中使用,且用於引用該方法所屬的物件
- 通常用於存取物件的屬性和呼叫物件的方法
範例:
class Foo {
public string $bar = 'bar';
// 存取屬性
public function getBar(): string
{
return $this->bar;
}
// 呼叫方法
public function printBar(): void
{
echo $this->getBar();
}
}
$foo = new Foo();
$foo->bar = 'my_bar';
$foo->printBar(); // 印出my_bar
2. self
說明:
self
是用於在類別內部引用自身的關鍵字- 它可以在靜態方法和非靜態方法中引用未實例化的類別本身
- 使用
self
時,引用的是定義該關鍵字的類別,而不是實例化後的物件,所以被繼承之後,self
指的還是當初的父類別
範例:
class Foo {
const BAR = 'bar';
public function printBar(): void
{
echo self::BAR;
}
}
class Foo2 extends Foo
{
const BAR = 'bar2';
}
$foo2 = new Foo2();
$foo2->printBar(); // 印出bar
3. static
說明:
static
也是用於在類別內部引用自身的關鍵字- 它可以在靜態方法和非靜態方法中引用未實例化的類別本身
- 不同於
self
,static
在運行時繫結,因此可以實現後期繫結(Late Static Binding),引用該方法實際被調用的類別class Foo { const BAR = 'bar'; public function printBar(): void { echo static::BAR; } } class Foo2 extends Foo { const BAR = 'bar2'; } $foo2 = new Foo2(); $foo2->printBar(); // 印出bar2
比對表
特性 | $this | self | static |
---|---|---|---|
是否實例化 | 是 | 否 | 否 |
聯繫對象 | 調用時的實例化物件內容 | 編譯時的類別 | 實際被調用的類別 |
是否能在靜態方法中使用 | 否 | 是 | 是 |
繼承後造成差異 | 是 | 否 | 是 |
[PHP] $this、self與static的差別
https://hankz1108.github.io/posts/20240310-php-self-and-static/