在本系列中,我將介紹 PHP 物件導向程式設計 (OOP) 的基礎知識。內容將被組織成連續的部分,每個部分都專注於一個特定的主題。如果您是初學者或不熟悉 OOP 概念,本系列旨在逐步指導您。 在這一部分,我將討論 PHP 中的靜態屬性、方法以及 this 與 self。讓我們一起開始學習PHP OOP的旅程吧!
什麼是屬性和方法?
首先,讓我們試著理解屬性和方法。當我們使用一個類別建立多個物件時,每個物件都會分配一個單獨的記憶體位置。結果,該物件的所有屬性和方法也被分配到該特定的記憶體位置。
這表示當我們更改物件的任何屬性時,變更僅限於該特定物件。它不會影響任何其他對象,因為類別的屬性和方法與該類別的相應對象相關聯。
要從類別外部存取這些屬性或方法,我們需要建立該類別的物件。但是,如果我們想存取類別內的這些屬性或方法,我們可以使用 $this 關鍵字。 $this 關鍵字表示該類別的目前物件。稍後我們將詳細了解 $this 關鍵字。讓我們來看下面的範例:
程式碼範例
class Car { public $name; public $color; function __construct(string $name, string $color) { $this->name = $name; $this->color = $color; } public function getValue() { echo "Car name: $this->name\n"; echo "Car color: $this->color\n"; } } $tesla = new Car('Zip', 'Blue'); $tesla->getValue();
在此範例中,我們可以看到,為了存取類別的屬性,我們在同一類別的方法中使用了 $this 關鍵字。同樣,為了從外部使用此類的任何方法,我們創建了該類別的一個物件。這就是我們通常使用類別的普通屬性或方法的方式。
什麼是靜態屬性和靜態方法?
但是,靜態屬性或方法的工作方式有所不同。當我們定義一個類別時,它只分配一次記憶體位置。類似地,當我們在類別中定義靜態屬性或方法時,它們也會與類別本身一起分配到特定的記憶體位置,但只分配一次。
因此,如果我們稍後修改任何靜態屬性或方法,變更將反映在該類別的所有實例中。換句話說,無論在哪裡使用靜態屬性或方法,它的更新值都將可用。
如果我們想從類別外部存取靜態屬性或方法,我們可以使用::(範圍解析運算子)而不建立物件。或者,我們也可以在創建物件後存取它們。要從類別內部存取它們,我們可以使用 self 關鍵字或類別名稱本身。這裡,self關鍵字代表類別。
稍後我們將更詳細地探討 self 關鍵字。讓我們來看下面的範例:
程式碼範例
class Car { public $name; public $color; function __construct(string $name, string $color) { $this->name = $name; $this->color = $color; } public function getValue() { echo "Car name: $this->name\n"; echo "Car color: $this->color\n"; } } $tesla = new Car('Zip', 'Blue'); $tesla->getValue();
在此範例中,我們可以看到,為了存取類別的靜態屬性,我們在同一類別的方法中使用了 self 關鍵字。此外,為了使用類別外部的靜態方法,我們建立了該類別的一個物件。但是,我們也可以使用類別名稱和 ::(範圍解析運算子)直接存取它,而無需建立物件。這就是我們通常使用類別的靜態屬性或方法的方式。
在上面的範例中,我們可以看到,使用 Car 類,我們建立了兩個具有不同資料的物件:$toyota 和 $bmw。現在我們要存取這些物件的值。如果我們運行上面的程式碼,我們將看到以下輸出:
程式碼範例
class Car { public static $name; public static $color; function __construct($name, $color) { self::$name = $name; self::$color = $color; } public static function getValue() { echo "Car name: " . self::$name . "\n"; echo "Car color: " . self::$color . "\n"; } } $toyota = new Car('Toyota', 'Black'); $bmw = new Car('BMW', 'Orange'); $toyota::getValue(); $bmw::getValue(); Car::getValue();
我們可以看到兩個物件顯示相同的值。換句話說,我們獲取的值來自最近創建的物件。即使當我們嘗試直接透過類別存取值時,我們仍然得到相同的值,即第二個物件的值。
原因很清楚。如前所述,靜態屬性或方法是在單一記憶體位置中建立的。如果從任何地方變更靜態屬性或方法,則該變更會影響該類別的所有實例。
在上面的範例中,當我們建立第二個物件時,屬性值在物件建立後立即發生變化。此變更也影響了先前建立的對象,因為該類別的所有對象共用相同的靜態屬性或方法。
重要的是要記住,類別的靜態屬性或方法不能像普通類別屬性或方法一樣使用。您不能使用 → 運算子來存取它們。相反,無論您是從類別內部還是外部存取它們,您都必須使用 ::(範圍解析運算子)。
$this 與 self 關鍵字
$這是什麼?
我們已經看到了 $this 和 self 關鍵字的用法。現在,讓我們更深入地研究這些概念,以便更好地理解它們。
$this 是一個內建的 PHP 關鍵字。當我們使用類別建立一個或多個物件時,可以使用類別中的 $this 關鍵字存取類別中定義的普通屬性和方法。
現在,我們知道,當定義一個類別時,它只會被分配到特定的記憶體位置一次。這可能會引發一個問題:如果我們從此類建立多個對象,$this 關鍵字是否只能對所有對象存取一次屬性或方法?
答案是「不」。這是因為,正如我們已經討論過的,$this 關鍵字並不代表類別本身,而是代表該類別創建的物件。換句話說,$this 與物件直接相關。因此,對於建立的每個對象,$this 關鍵字將分別存取每個對象的類別的屬性和方法。讓我們來看下面的範例:
class Car { public $name; public $color; function __construct(string $name, string $color) { $this->name = $name; $this->color = $color; } public function getValue() { echo "Car name: $this->name\n"; echo "Car color: $this->color\n"; } } $tesla = new Car('Zip', 'Blue'); $tesla->getValue();
在前面的例子中,我們多次使用了它,但沒有詳細討論$this的用法。現在我們對 $this 有了一些了解,我們可以更好地理解它的用法。使用這個類,我們創建了物件。現在,我們知道 $this 關鍵字分別存取每個物件的屬性。
但是,要注意的是,$this 關鍵字不能在靜態方法中使用。為什麼不能使用將很快解釋。
self 關鍵字是什麼?
我們已經知道,當一個類別被定義時,它只會被分配到一個記憶體位置一次。同樣,該類別中的所有靜態屬性和方法也與該類別一起分配到記憶體位置,僅一次。
因此,當我們使用此類建立物件時,不會為每個物件單獨建立靜態屬性或方法。這就是為什麼我們無法使用 $this 關鍵字存取這些靜態屬性或方法。 $this 關鍵字代表類別的對象,由於靜態屬性或方法不與任何對象相關,而是直接與類別本身相關,因此無法使用 $this 存取它們。
要存取類別中的靜態屬性或方法,我們使用 self 關鍵字或類別名稱以及 ::(範圍解析運算子)。這是因為 self 關鍵字代表類別本身。讓我們來看下面的範例:
class Car { public static $name; public static $color; function __construct($name, $color) { self::$name = $name; self::$color = $color; } public static function getValue() { echo "Car name: " . self::$name . "\n"; echo "Car color: " . self::$color . "\n"; } } $toyota = new Car('Toyota', 'Black'); $bmw = new Car('BMW', 'Orange'); $toyota::getValue(); $bmw::getValue(); Car::getValue();
在此範例中,我們看到我們可以使用類別名稱或 self 關鍵字以及 ::scope 解析運算子輕鬆存取非靜態方法中的靜態成員,因為它們與類別相關。因此,要存取它們,我們不需要建立單獨的物件。
但是,如果我們想在靜態方法中存取非靜態成員,則需要使用 $this 關鍵字。但我們知道,靜態方法中不能使用$this關鍵字,因為$this與物件相關,而非靜態成員與物件無關。這就是我們不能在靜態方法中使用 $this 關鍵字的原因。
但是,如果我們需要在靜態方法中存取非靜態成員,我們可以在靜態方法中建立類別的實例或對象,然後使用 $this 關鍵字來存取它們,如上例所示.
希望這能讓您更清楚地了解 $this 和 self 關鍵字的用法。這就是今天的全部內容;我們下一課繼續。
您可以在 GitHub 和 Linkedin 上與我聯絡。
以上是PHP OOP 部分靜態屬性、方法以及 this 與 self的詳細內容。更多資訊請關注PHP中文網其他相關文章!

長URL(通常用關鍵字和跟踪參數都混亂)可以阻止訪問者。 URL縮短腳本提供了解決方案,創建了簡潔的鏈接,非常適合社交媒體和其他平台。 這些腳本對於單個網站很有價值

在Facebook在2012年通過Facebook備受矚目的收購之後,Instagram採用了兩套API供第三方使用。這些是Instagram Graph API和Instagram Basic Display API。作為開發人員建立一個需要信息的應用程序

Laravel使用其直觀的閃存方法簡化了處理臨時會話數據。這非常適合在您的應用程序中顯示簡短的消息,警報或通知。 默認情況下,數據僅針對後續請求: $請求 -

這是有關用Laravel後端構建React應用程序的系列的第二個也是最後一部分。在該系列的第一部分中,我們使用Laravel為基本的產品上市應用程序創建了一個RESTFUL API。在本教程中,我們將成為開發人員

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显著减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

PHP客戶端URL(curl)擴展是開發人員的強大工具,可以與遠程服務器和REST API無縫交互。通過利用Libcurl(備受尊敬的多協議文件傳輸庫),PHP curl促進了有效的執行

您是否想為客戶最緊迫的問題提供實時的即時解決方案? 實時聊天使您可以與客戶進行實時對話,並立即解決他們的問題。它允許您為您的自定義提供更快的服務

2025年的PHP景觀調查調查了當前的PHP發展趨勢。 它探討了框架用法,部署方法和挑戰,旨在為開發人員和企業提供見解。 該調查預計現代PHP Versio的增長


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SublimeText3漢化版
中文版,非常好用

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver Mac版
視覺化網頁開發工具