[PHP] $this、self與static的差別

本文最後更新於:2024年5月2日 晚上

在PHP中可以用$thisself、與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 也是用於在類別內部引用自身的關鍵字
  • 它可以在靜態方法和非靜態方法中引用未實例化的類別本身
  • 不同於 selfstatic 在運行時繫結,因此可以實現後期繫結(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

比對表

特性$thisselfstatic
是否實例化
聯繫對象調用時的實例化物件內容編譯時的類別實際被調用的類別
是否能在靜態方法中使用
繼承後造成差異

[PHP] $this、self與static的差別
https://hankz1108.github.io/posts/20240310-php-self-and-static/
作者
Hankz
發布於
2024年3月10日
更新於
2024年5月2日
許可協議