本文目標:
1、了解PHP中魔術方法的定義
#2、了解__call()魔術方法的使用情境
3、掌握__call()魔術方法的用法
4、了解__callStatic()魔術方法的使用場景
#5、掌握__callStatic()魔術方法的用法
(一)、了解PHP中魔術方法的定義
PHP 將所有以__(兩個底線)開頭的類別方法保留為魔術方法。所以在定義類別方法時,除了上述魔術方法,建議不要以 __ 為前綴。
這2個魔術方法,還有個叫法,還可以稱為方法的重載(overloading)
(二)、了解__call()魔術方法的使用場景
為了在呼叫一個類別中不存在的方法時不報錯,我們可以在類別中定義_ _call方法,它會在此刻被自動執行
(三)、掌握__call()魔術方法的用法
總結:
1、PHP中__call在類別中定義格式如下public function __call(參數1,參數2),這裡注意必須是2個__,必須是__call,而且必須是要帶2個參數,多一個少一個都不行
2、當呼叫不存在的方法時,系統會自動觸發物件所在類別的定義好的__call方法
每個總結都是透過實踐得出來的,現在我們用實踐來示範總結,這樣可以促進理解,讓每個總結理解起來更加清晰,直觀
#案例一、
#實作目標:
1、PHP中__call在類別中定義格式如下public function __call(參數1,參數2),這裡注意必須是2個__,必須是__call,而且必須是要帶2個參數,多一個少一個都不行
具體代碼如下:先不帶參數看下
<?php class Animal{ public function eat(){ } public function sleep(){ } //魔术方法 public function __call(){ echo "自动执行了Animal类中的__call方法<br/>"; } } $ani = new Animal(); ?>
運行結果如下:
Fatal error: Method Animal::__call() must take exactly 2 arguments in D:\E -class\class-code\classing\index.php on line #15
現在寫上2個參數
<?php class Animal{ public $name = ""; public function __construct($name){ $this->name = $name; } public function eat(){ } public function sleep(){ } //魔术方法 public function __call($name,$args){ echo "自动执行了Animal类中的__call方法<br/>"; } } $monkey = new Animal("猴子"); ?>
運行結果如下:
空白頁面,說明沒報錯,正確
案例二、
實作目標:
1、當呼叫不存在的方法時,系統會自動觸發物件所在類別的定義好的__call方法
具體程式碼如下:
<?php class Animal{ public $name = ""; public function __construct($name){ $this->name = $name; } public function eat(){ } public function sleep(){ } //魔术方法 public function __call($name,$args){ echo "自动执行了Animal类中的__call方法<br/>"; } } $monkey = new Animal("猴子"); //调用不存在的方法 $monkey->test(); ?>
執行結果為:
自動執行了Animal類別中的__call方法
我们发现其实我们没有手动的去调用__call方法,也就是说没有写成$monkey->__call(),但是这个方法依然执行了,因为什么呢?因为我们写了$monkey->test();而这个test方法没有在类中定义,然后这个类中又定义了这个魔术方法,所以它就像魔术一样,突然就被自动执行了
这里一定要注意,是2个下划线,不是一个,否则就不是魔术方法了,下面还是再来做下测试
具体代码如下:
<?php class Animal{ public $name = ""; public function __construct($name){ $this->name = $name; } public function eat(){ } public function sleep(){ } //魔术方法 试着少写一个_看下 public function _call($name,$args){ echo "自动执行了Animal类中的__call方法<br/>"; } } $monkey = new Animal("猴子"); //调用不存在的方法 $monkey->test(); ?>
运行结果为:
Fatal error: Uncaught Error: Call to undefined method Animal::test() in D:\E-class\class-code\classing\index.php:20 Stack trace: #0 {main} thrown in D:\E-class\class-code\classing\index.php on line 20
所以此刻就会报错了,因为没有__call的魔术方法了,所以一定要注意是2个下划线,就好像构造函数和析构函数一样,都是两个下划线
(四)、了解__callStatic()魔术方法的使用场景
为了在调用一个类中不存在的静态方法时,不报错,我们可以在类中定义__callStatic方法,它会在此刻被自动执行
(五)、掌握__callStatic()魔术方法的用法
1、PHP中__callStatic在类中定义格式如下 static public function __callStatic(参数1,参数2),这里注意必须是2个__,必须是__callStatic,而且必须是要带2个参数,多一个少一个都不行
2、当调用不存在的静态方法时,系统会自动触发对象所在类的定义好的__callStatic方法
每个总结都是通过实践得出来的,现在我们用实践来演示总结,这样可以促进理解,让每个总结理解起来更加清晰,直观
案例一、
实践目标:
1、PHP中__callStatic在类中定义格式如下 static public function __callStatic(参数1,参数2),这里注意必须是2个__,必须是__callStatic,而且必须是要带2个参数,多一个少一个都不行
具体代码如下:
<?php class Animal{ public $name = ""; public function __construct($name){ $this->name = $name; } public function eat(){ } public function sleep(){ } static public function staticFun(){ echo "Animal中的staticFun执行了<br/>"; } //魔术方法 static public function __callStatic($name,$args){ echo "自动执行了Animal类中的__callStatic方法<br/>"; } } //调用不存在的静态方法 Animal::staticFun(); Animal::test(); ?>
运行结果如下:
Animal中的staticFun执行了
自动执行了Animal类中的__callStatic方法
我们发现其实我们没有手动的去调用__callStatic方法,也就是说没有写成Animal::__callStatic(),但是这个方法依然执行了,因为什么呢?因为我们写了Animal::test();这个静态方法在类中不存在,然后这个类中又定义了这个魔术方法,所以它就像魔术一样,突然就被自动执行了
这里一定要注意,是2个下划线,不是一个,否则就不是魔术方法了,下面还是再来做下测试
<?php class Animal{ public $name = ""; public function __construct($name){ $this->name = $name; } public function eat(){ } public function sleep(){ } static public function staticFun(){ echo "Animal中的staticFun执行了<br/>"; } //魔术方法 试着少写一个 static public function _callStatic($name,$args){ echo "自动执行了Animal类中的__callStatic方法<br/>"; } } //调用不存在的静态方法 Animal::staticFun(); Animal::test(); ?>
运行结果如下:
Animal中的staticFun执行了
Fatal error: Uncaught Error: Call to undefined method Animal::test() in D:\E-class\class-code\classing\index.php:23 Stack trace: #0 {main} thrown in D:\E-class\class-code\classing\index.php on line 23
所以此刻就会报错了,因为没有__callStatic的魔术方法了,所以一定要注意是2个下划线,就好像构造函数和析构函数一样,都是两个下划线,而且一定要记得这个魔术方法本身就是static静态方法,否则也不会对
重要的东西我们还是用代码实践一下:
<?php class Animal{ public $name = ""; public function __construct($name){ $this->name = $name; } public function eat(){ } public function sleep(){ } // static public function staticFun(){ // echo "Animal中的staticFun执行了<br/>"; // } //魔术方法 试着少写static public function __callStatic($name,$args){ echo "自动执行了Animal类中的__callStatic方法<br/>"; } } //调用不存在的静态方法 // Animal::staticFun(); Animal::test(); ?>
运行结果为:
Warning: The magic method __callStatic() must have public visibility and be static in D:\E-class\class-code\classing\index.php on line 17
自动执行了Animal类中的__callStatic方法
所以一定要注意,__callStatic本身就是静态方法,不要少写static
(六)、总结
1、本文主要讲了另外2个魔术方法,__call,__callStatic,讲了他们的使用场景以及具体的实现
希望本文能给大家带来一定的帮助,谢谢!!!
以上是PHP魔術方法之__call和__callStatic詳解(程式碼實例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHP在現代Web開發中仍然重要,尤其在內容管理和電子商務平台。 1)PHP擁有豐富的生態系統和強大框架支持,如Laravel和Symfony。 2)性能優化可通過OPcache和Nginx實現。 3)PHP8.0引入JIT編譯器,提升性能。 4)雲原生應用通過Docker和Kubernetes部署,提高靈活性和可擴展性。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP在現代編程中仍然是一個強大且廣泛使用的工具,尤其在web開發領域。 1)PHP易用且與數據庫集成無縫,是許多開發者的首選。 2)它支持動態內容生成和麵向對象編程,適合快速創建和維護網站。 3)PHP的性能可以通過緩存和優化數據庫查詢來提升,其廣泛的社區和豐富生態系統使其在當今技術棧中仍具重要地位。

在PHP中,弱引用是通過WeakReference類實現的,不會阻止垃圾回收器回收對象。弱引用適用於緩存系統和事件監聽器等場景,需注意其不能保證對象存活,且垃圾回收可能延遲。

\_\_invoke方法允許對象像函數一樣被調用。 1.定義\_\_invoke方法使對象可被調用。 2.使用$obj(...)語法時,PHP會執行\_\_invoke方法。 3.適用於日誌記錄和計算器等場景,提高代碼靈活性和可讀性。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

禪工作室 13.0.1
強大的PHP整合開發環境