PHP所提供的"重載"(overloading)是指動態地"建立"類別屬性和方法。我們是透過魔術方法(magic methods)來實現的。
當呼叫目前環境下未定義或不可見的類別屬性或方法時,重載方法會被呼叫。
所有的重載方法都必須宣告為 public。
注意:
1)這些魔術方法的參數都不能透過引用傳遞。
2)PHP中的"重載"與其它絕大多數物件導向語言不同。傳統的"重載"是用來提供多個同名的類別方法,但各方法的參數類型和個數不同。
屬性重載
public void__set(string$name, mixed$value) publicmixed__get(string$name) publicbool__isset(string$name) publicvoid__unset(string$name)
在賦值不可存取屬性時,__set() 會被呼叫。
讀取不可存取屬性的值時,__get() 會被呼叫。
當對不可存取屬性呼叫 isset() 或 empty() 時,__isset() 會被呼叫。
當對不可存取屬性呼叫 unset() 時,__unset() 會被呼叫。
參數 $name 是指要操作的變數名稱。 __set() 方法的 $value 參數指定了 $name 變數的值。
屬性重載只能在物件中進行。在靜態方法中,這些魔術方法將不會被呼叫。所以這些方法都不能被 宣告為 static。從 PHP 5.3.0 起, 將這些魔術方法定義為 static 會產生一個警告。
注意:
因為 PHP 處理賦值運算的方式,__set() 的回傳值會被忽略。類似的, 在下面這樣的鍊式賦值中,__get() 不會被調用:
$a = $obj->b = 8;
注意:
在除 isset() 外的其它語言結構中無法使用重載的屬性,這表示當對一個重載的屬性使用 empty() 時,重載魔術方法將不會被呼叫。
為避開此限制,必須將重載屬性賦值到本地變數再使用 empty()。
Example #1 使用 __get(),__set(),__isset() 和 __unset() 進行屬性重載
class PropertyTest{ /*被重载的数据保存在此*/ private $data = array(); /*重载不能被用在已经定义的属性*/ public $declared = 1; /*只有从类外部访问这个属性时,重载才会发生*/ private $hidden = 2; public function __set($name,$value) { echo "Setting '$name' to '$value'<br>"; $this->data[$name] = $value; } public function __get($name) { echo "Getting '$name'<br>"; if(array_key_exists($name,$this->data)){ return $this->data[$name]; } $trace = debug_backtrace(); trigger_error('未知属性 via __get():'.$name.' in '.$trace[0]['file'].' on line '.$trace[0]['line'], E_USER_NOTICE); return null; } /*PHP5.1.0之后的版本*/ public function __isset($name){ echo "Is '$name' set?<br>"; return isset($this->data[$name]); } /*PHP5.1.0之后的版本*/ public function __unset($name){ echo "Unsetting '$name'<br>"; unset($this->data[$name]); } /*非魔术方法*/ public function getHidden(){ return $this->hidden; } } echo '<pre class="brush:php;toolbar:false">'; $obj = new PropertyTest; $obj->a = 1; echo $obj->a.'<br>'; var_dump(isset($obj->a)); unset($obj->a); echo '<br>'; echo $obj->declared.'<br>'; echo "Let's experiment with the private property named 'hidden':<br>"; echo "Privates are visible inside the class,so __set() not used...<br>"; echo $obj->getHidden().'<br>'; echo "Privates not visible outside of class,so __get() is used...<br>"; echo $obj->hidden;
輸出結果:
Setting 'a' to '1'
Is 'a' set?bool(true)Unsetting 'a'
1
) iniv. ...
2
Privates not visible outside of class,so __get() is used...
Getting 'hidden'
方法重載
public mixed __call ( string$name , array$arguments ) public static mixed __callStatic ( string$name , array$arguments )
在物件中使用一個不可存取方法時,__call(__在物件中) 會被呼叫。
用靜態方式中呼叫一個不可存取方法時,__callStatic() 會被呼叫。
$name 參數是要呼叫的方法名稱。 $arguments 參數是一個枚舉數組,包含著要傳遞給方法 $name 的參數。
Example #2 使用 __call() 和 __callStatic() 對方法重載
class MethodTest { public function __call($name,$arguments) { //注意:$name的值区分大小写 echo "Calling object method '$name' ".implode(',',$argument).'<br>'; } //PHP5.3.0之后的版本 public static function __callStatic($name,$arguments) { //注意:$name的值区分大小写 echo "Calling static method '$name' ".implode(',',$argument).'<br>'; } } $obj = new MethodTest; $obj -> runTest('in object context'); MethodTest::runTest('in static context');
輸出結果:
Calling object method 'runTest'
Calling object method 'runTest'

PHP仍然流行的原因是其易用性、靈活性和強大的生態系統。 1)易用性和簡單語法使其成為初學者的首選。 2)與web開發緊密結合,處理HTTP請求和數據庫交互出色。 3)龐大的生態系統提供了豐富的工具和庫。 4)活躍的社區和開源性質使其適應新需求和技術趨勢。

PHP和Python都是高層次的編程語言,廣泛應用於Web開發、數據處理和自動化任務。 1.PHP常用於構建動態網站和內容管理系統,而Python常用於構建Web框架和數據科學。 2.PHP使用echo輸出內容,Python使用print。 3.兩者都支持面向對象編程,但語法和關鍵字不同。 4.PHP支持弱類型轉換,Python則更嚴格。 5.PHP性能優化包括使用OPcache和異步編程,Python則使用cProfile和異步編程。

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

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

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

PHP在現代化進程中仍然重要,因為它支持大量網站和應用,並通過框架適應開發需求。 1.PHP7提升了性能並引入了新功能。 2.現代框架如Laravel、Symfony和CodeIgniter簡化開發,提高代碼質量。 3.性能優化和最佳實踐進一步提升應用效率。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

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

SublimeText3 Linux新版
SublimeText3 Linux最新版

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

Atom編輯器mac版下載
最受歡迎的的開源編輯器

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