這次的單元我來稍微介紹一下 PHP 裡面常看到的一些屬性與方法。
訪問修飾符 access modifiers
訪問修飾符用於控制類屬性和方法的可見性。在 PHP 中,除了預設的 default
,還有三種修飾符:public
、private
和 protected
。- public:訪問權限最寬鬆,可以在類內部、類外部以及繼承的子類中訪問。
- private:訪問權限最嚴格,只能在類內部訪問。用於封裝數據,保護類內部的實現。
- protect:訪問權限介於中間,類內部和繼承的子類中都可以訪問,但在類外部無法訪問。
方法修飾符
方法修飾符總共有三種,分別為 static
、final
、abstract
。- static:靜態資源,在類別加載時就分配空間,所有實例共用一份。使用靜態方法時,只需透過
類名::屬性
或 類名::方法名()
來調用。 - 靜態屬性:表示此屬性屬於類別本身。
- 靜態方法:表示此方法屬於類別本身,而非類別的實例,因此只能訪問類別的靜態方法。
- final:最終資源,表示該方法無法被改寫或繼承,常用於防止子類修改其行為。
- abstract:抽象資源,表示該類別無法被實例化。通常用於定義必須的屬性和方法,以限制子類必須實現這些屬性和方法。後續章節會詳細介紹。
readonly
readonly
是從 PHP 8.1 開始新增的屬性修飾符,用於使屬性無法被修改,但仍然可以被訪問。這個修飾符的主要用途是確保屬性在創建後不會被更改,讓使用者可以放心引用,而不必擔心該值在其他地方被調整。
魔術方法
PHP 提供了多種魔術方法,這些方法通常以 __
開頭。以下是幾種常用的魔術方法介紹:
__construct()
當創建目標物件時,可以使用構造函數來定義一些初始化的內容,確保在物件構建時同時完成初始化。
__get()、__set()、__isset()
這三個方法分別用於獲取、設置和確認屬性是否已被設置的功能。
__call()
此方法主要用於檢查被呼叫的方法是否存在於該類別中。
__invoke()
這個魔術方法的使用頻率較高,但對初學者來說可能較難理解。簡單來說,__invoke()
可以讓物件被視作函數來使用。一般情況下,當我們實例化一個類別為物件時,只能呼叫該類別本身所包含的函數,而 __invoke()
則允許我們直接將這個類別作為函數使用。你可以參考這篇文章中的舉例:PHP 魔術方法|三分鐘看懂 __invoke 用法。在實作中,尤其是在 MVC 架構中,Controller 通常負責一件特定的事情,並使用 __invoke()
來實現 RESTful API 架構。
對於初學者來說,魔術方法可能是最難掌握的概念之一。由於魔術方法不具備一般函數的名稱,因此在未經過專門學習的情況下,直接在程式碼中看到這些方法時,想要使用 IDE 的 declaration 功能查詢內容往往會失敗(這取決於 IDE 的功能強弱)。因此,每次遇到魔術方法時,都可以視作一次學習經驗。
參考資料:
- https://www.cnblogs.com/SharkJiao/p/14117095.html
- https://www.ithome.com.tw/news/148077
- https://php.watch/versions/8.1/readonly
- https://www.cnblogs.com/ttaylor/p/15269534.html
- https://laravel.com/docs/9.x/controllers#single-action-controllers
- https://driesvints.com/blog/the-beauty-of-single-action-controllers/
- https://devindeving.blogspot.com/2021/12/php-magic-method-invoke.html