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

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
您如何修改PHP會話中存儲的數據?您如何修改PHP會話中存儲的數據?Apr 27, 2025 am 12:23 AM

tomodifyDataNaphPsession,startTheSessionWithSession_start(),然後使用$ _sessionToset,修改,orremovevariables.1)startThesession.2)setthesession.2)使用$ _session.3)setormodifysessessvariables.3)emovervariableswithunset()

舉一個在PHP會話中存儲數組的示例。舉一個在PHP會話中存儲數組的示例。Apr 27, 2025 am 12:20 AM

在PHP會話中可以存儲數組。 1.啟動會話,使用session_start()。 2.創建數組並存儲在$_SESSION中。 3.通過$_SESSION檢索數組。 4.優化會話數據以提升性能。

垃圾收集如何用於PHP會議?垃圾收集如何用於PHP會議?Apr 27, 2025 am 12:19 AM

PHP會話垃圾回收通過概率機制觸發,清理過期會話數據。 1)配置文件中設置觸發概率和會話生命週期;2)可使用cron任務優化高負載應用;3)需平衡垃圾回收頻率與性能,避免數據丟失。

如何在PHP中跟踪會話活動?如何在PHP中跟踪會話活動?Apr 27, 2025 am 12:10 AM

PHP中追踪用戶會話活動通過會話管理實現。 1)使用session_start()啟動會話。 2)通過$_SESSION數組存儲和訪問數據。 3)調用session_destroy()結束會話。會話追踪用於用戶行為分析、安全監控和性能優化。

如何使用數據庫存儲PHP會話數據?如何使用數據庫存儲PHP會話數據?Apr 27, 2025 am 12:02 AM

利用數據庫存儲PHP會話數據可以提高性能和可擴展性。 1)配置MySQL存儲會話數據:在php.ini或PHP代碼中設置會話處理器。 2)實現自定義會話處理器:定義open、close、read、write等函數與數據庫交互。 3)優化和最佳實踐:使用索引、緩存、數據壓縮和分佈式存儲來提升性能。

簡單地說明PHP會話的概念。簡單地說明PHP會話的概念。Apr 26, 2025 am 12:09 AM

phpsessionstrackuserdataacrossmultiplepagerequestsusingauniqueIdStoredInAcookie.here'showtomanageThemeffectionaly:1)startAsessionWithSessionWwithSession_start()和stordoredAtain $ _session.2)

您如何循環中存儲在PHP會話中的所有值?您如何循環中存儲在PHP會話中的所有值?Apr 26, 2025 am 12:06 AM

在PHP中,遍歷會話數據可以通過以下步驟實現:1.使用session_start()啟動會話。 2.通過foreach循環遍歷$_SESSION數組中的所有鍵值對。 3.處理複雜數據結構時,使用is_array()或is_object()函數,並用print_r()輸出詳細信息。 4.優化遍歷時,可採用分頁處理,避免一次性處理大量數據。這將幫助你在實際項目中更有效地管理和使用PHP會話數據。

說明如何使用會話進行用戶身份驗證。說明如何使用會話進行用戶身份驗證。Apr 26, 2025 am 12:04 AM

會話通過服務器端的狀態管理機制實現用戶認證。 1)會話創建並生成唯一ID,2)ID通過cookies傳遞,3)服務器存儲並通過ID訪問會話數據,4)實現用戶認證和狀態管理,提升應用安全性和用戶體驗。

See all articles

熱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

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

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Safe Exam Browser

Safe Exam Browser

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