首頁 後端開發 php教程 PHP OOP 部分靜態屬性、方法以及 this 與 self

PHP OOP 部分靜態屬性、方法以及 this 與 self

Jan 04, 2025 pm 04:36 PM

PHP OOP Part-Static property, method and this vs self

在本系列中,我將介紹 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1675
14
CakePHP 教程
1429
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? 說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? Apr 17, 2025 am 12:06 AM

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? Apr 17, 2025 am 12:25 AM

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP和Python:代碼示例和比較 PHP和Python:代碼示例和比較 Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

您如何防止PHP中的SQL注入? (準備的陳述,PDO) 您如何防止PHP中的SQL注入? (準備的陳述,PDO) Apr 15, 2025 am 12:15 AM

在PHP中使用預處理語句和PDO可以有效防範SQL注入攻擊。 1)使用PDO連接數據庫並設置錯誤模式。 2)通過prepare方法創建預處理語句,使用佔位符和execute方法傳遞數據。 3)處理查詢結果並確保代碼的安全性和性能。

PHP:處理數據庫和服務器端邏輯 PHP:處理數據庫和服務器端邏輯 Apr 15, 2025 am 12:15 AM

PHP在數據庫操作和服務器端邏輯處理中使用MySQLi和PDO擴展進行數據庫交互,並通過會話管理等功能處理服務器端邏輯。 1)使用MySQLi或PDO連接數據庫,執行SQL查詢。 2)通過會話管理等功能處理HTTP請求和用戶狀態。 3)使用事務確保數據庫操作的原子性。 4)防止SQL注入,使用異常處理和關閉連接來調試。 5)通過索引和緩存優化性能,編寫可讀性高的代碼並進行錯誤處理。

PHP的目的:構建動態網站 PHP的目的:構建動態網站 Apr 15, 2025 am 12:18 AM

PHP用於構建動態網站,其核心功能包括:1.生成動態內容,通過與數據庫對接實時生成網頁;2.處理用戶交互和表單提交,驗證輸入並響應操作;3.管理會話和用戶認證,提供個性化體驗;4.優化性能和遵循最佳實踐,提升網站效率和安全性。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

See all articles