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

閱讀時間約 3 分鐘
此文章同步刊登於我的部落格


在PHP中可以用$thisself、與static代表自己這個類別

有些人可能搞不清楚他們的區別,尤其是self、與static

但是他們各別有自己的意義和用法

在實戰中這些些微的差別可能就會造成不可預期的問題

今天我們就來仔細說明一下他們之間的差別吧


一、$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

二、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


三、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

比對表

7會員
21內容數
你可以在這裡看到後端工程師的技術文章 也可以看到一些投資相關的心得分享 歡迎交流~
留言0
查看全部
發表第一個留言支持創作者!
Hankz是名工程師 的其他內容
在寫CI的時候是否曾經遇過out of memory的錯誤呢?CodeIgniter作為輕量化的PHP框架,db物件一直是操作資料庫的好幫手,簡化了下達sql指令時的操作,加快了開發的速度,但其實看似好用的工具裡說不定有著隱藏的問題。
如果有在Windows系統中備份資料的需求,如果可以寫好一個批次檔並使用工作排程定期複製檔案到指定目錄那就太方便了,本篇文張教你使用xcopy指令實現的一個簡易的bat。
由於開發多個專案的時候,頻繁切換本地環境的PHP版本實在太麻煩,於是想要可以直接使用指令就完成切換的功能,於是有了這篇文章。
Simple Storage Service (S3) 是 AWS 最常應用到的服務,只要是需要將檔案上傳到雲端的狀況都可以使用S3,本篇文章將介紹如何設定與使用AWS S3。
如果MySQL忘記密碼,可以使用修改cnf檔案免去登入驗證,再進入MySQL重新設定密碼的方式,找回密碼,另外還附上有一般修改密碼的方式。
本篇文章將會說明如何在Linux中使用RPM離線安裝MySQL。
在寫CI的時候是否曾經遇過out of memory的錯誤呢?CodeIgniter作為輕量化的PHP框架,db物件一直是操作資料庫的好幫手,簡化了下達sql指令時的操作,加快了開發的速度,但其實看似好用的工具裡說不定有著隱藏的問題。
如果有在Windows系統中備份資料的需求,如果可以寫好一個批次檔並使用工作排程定期複製檔案到指定目錄那就太方便了,本篇文張教你使用xcopy指令實現的一個簡易的bat。
由於開發多個專案的時候,頻繁切換本地環境的PHP版本實在太麻煩,於是想要可以直接使用指令就完成切換的功能,於是有了這篇文章。
Simple Storage Service (S3) 是 AWS 最常應用到的服務,只要是需要將檔案上傳到雲端的狀況都可以使用S3,本篇文章將介紹如何設定與使用AWS S3。
如果MySQL忘記密碼,可以使用修改cnf檔案免去登入驗證,再進入MySQL重新設定密碼的方式,找回密碼,另外還附上有一般修改密碼的方式。
本篇文章將會說明如何在Linux中使用RPM離線安裝MySQL。
你可能也想看
Google News 追蹤
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
PHP(全名為「PHP: Hypertext Preprocessor」)是一門開源的伺服器端程式語言,為動態網頁開發設計。閱讀本文將讓您瞭解PHP的特點、廣泛支援、易學性、資源豐富以及跨平臺性。
PHP(Hypertext Preprocessor)是一種流行的開源腳本語言,特別適用於網頁開發。它具有簡單的語法和易於理解的程式碼結構,並且支持多種數據庫系統和其他技術和框架集成。本文將介紹PHP的主要特點和廣泛應用性。
Thumbnail
今天是撰寫PHP程式的第3天,遇見了第一個新的BUG。狀況是連上Database後,企圖將資料增加到資料庫裡。 然而卻出現「Fatal error: Uncaught mysqli_sql_exception: Unknown column 'username' in 'field list' i
Thumbnail
程式如下: 跑了五次,每次判斷一千萬回 f1() 陣列的方式: 5.2219750881195 5.194901943
Thumbnail
這支 PHP 的小程式,輸入時間,會顯示回傳的時間: 放在 command line 執行,如下: $ php cst.php “2018–04–01 00:00:00 cst” 多了 14 小時,好神奇。 追 PHP Source 好了,看問題在哪。找到這支定義時區的設定: timezonemap
  // $data is a two-dimensional array array_multisort(array_column($data, 'column_name'), SORT_ASC, $data); array_multisort(array_column($data, 'colum
Thumbnail
四捨五入到小數點後第二位,並自動補0到小數點後第二位: sprintf("%.2f", round($num,2)) 本筆記參考: 1. https://www.cnblogs.com/ryanzheng/p/12292852.html
Laravel 透過request()->ip拿到的ip不是client real ip,原來是因為前面有一層cloudflare,解決方法如下,改用下面這段script來取ip: E 可以包成helper function方便使用。 值得一提的是,HTTP_CF_CONNECTING_IP有可能
在PHP 7 版本之前,?: 這種寫法稱為,「Ternary Operator」: $data = isset($data) ? $data : 'hello'; PHP 7 之後,??這種寫法稱為「Null Coalescing Operator」: $data = $data ?? 'hell
Thumbnail
A. 安裝APPSERV 至官網下載https://www.appserv.org/en/ 最新版本APPSERV8.6.0並直接安裝: 安裝完包含預設五個資料夾: 請於【www】內加入網頁內容,預設首頁index.php。 於瀏覽器網址輸入【localhost】即可檢視到預設的首頁: B.
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
PHP(全名為「PHP: Hypertext Preprocessor」)是一門開源的伺服器端程式語言,為動態網頁開發設計。閱讀本文將讓您瞭解PHP的特點、廣泛支援、易學性、資源豐富以及跨平臺性。
PHP(Hypertext Preprocessor)是一種流行的開源腳本語言,特別適用於網頁開發。它具有簡單的語法和易於理解的程式碼結構,並且支持多種數據庫系統和其他技術和框架集成。本文將介紹PHP的主要特點和廣泛應用性。
Thumbnail
今天是撰寫PHP程式的第3天,遇見了第一個新的BUG。狀況是連上Database後,企圖將資料增加到資料庫裡。 然而卻出現「Fatal error: Uncaught mysqli_sql_exception: Unknown column 'username' in 'field list' i
Thumbnail
程式如下: 跑了五次,每次判斷一千萬回 f1() 陣列的方式: 5.2219750881195 5.194901943
Thumbnail
這支 PHP 的小程式,輸入時間,會顯示回傳的時間: 放在 command line 執行,如下: $ php cst.php “2018–04–01 00:00:00 cst” 多了 14 小時,好神奇。 追 PHP Source 好了,看問題在哪。找到這支定義時區的設定: timezonemap
  // $data is a two-dimensional array array_multisort(array_column($data, 'column_name'), SORT_ASC, $data); array_multisort(array_column($data, 'colum
Thumbnail
四捨五入到小數點後第二位,並自動補0到小數點後第二位: sprintf("%.2f", round($num,2)) 本筆記參考: 1. https://www.cnblogs.com/ryanzheng/p/12292852.html
Laravel 透過request()->ip拿到的ip不是client real ip,原來是因為前面有一層cloudflare,解決方法如下,改用下面這段script來取ip: E 可以包成helper function方便使用。 值得一提的是,HTTP_CF_CONNECTING_IP有可能
在PHP 7 版本之前,?: 這種寫法稱為,「Ternary Operator」: $data = isset($data) ? $data : 'hello'; PHP 7 之後,??這種寫法稱為「Null Coalescing Operator」: $data = $data ?? 'hell
Thumbnail
A. 安裝APPSERV 至官網下載https://www.appserv.org/en/ 最新版本APPSERV8.6.0並直接安裝: 安裝完包含預設五個資料夾: 請於【www】內加入網頁內容,預設首頁index.php。 於瀏覽器網址輸入【localhost】即可檢視到預設的首頁: B.