魔術方法也用的蠻多,最近在想一個問題,到底PHP為什麼要加入魔術方法這個東西,是為了更好的支援物件導向還是?
請各位路過的不吝賜教,以解小弟的疑惑!
回複內容:
魔術方法也用的蠻多,最近在想一個問題,到底PHP為什麼要加入魔術方法這個東西,是為了更好的支援物件導向還是?
請各位路過的不吝賜教,以解小弟的疑惑!
為什麼加入魔術方法?為什麼叫魔術方法,這其實不是主要問題
比如toString這個東西,java可以直接覆蓋toString,js也可以定義toString,php為什麼叫_toString?
構造方法,為什麼python叫__init__,php叫__construct?
然後關於php的__construct,手冊裡寫到
為了實現向後相容性,如果 PHP 5 在類中找不到 __construct() 函數並且也沒有從父類繼承一個的話,它就會嘗試尋找舊式的建構函式,也就是和類同名的函數。因此唯一會產生相容性問題的情況是:類中已有一個名為 __construct() 的方法卻被用於其它用途時。
也就是說php和java一樣之前也是支援同名函數做建構函式的,為什麼之後該了,也就是你的迷惑,我的理解,一種命名習慣而已,你說按說法這些函數會在特殊場合被自動調用,叫做魔術方法理論上沒錯,但是java也有這些,為什麼java沒搞出這個名詞?
但是說句實在的,php非得整出魔術方法這個名詞來,而不像其他語言把他混合在其他定義裡,比如js的toString就可以做一些題的考點,而且容易被忽略,php如果定義了魔術方法,那你複習的時候肯定要這些全看一次。。倒是方便考生和應聘者了
其實還是為了更好的支援物件導向,下面是一個例子。。。
sum2($args[0], $args[1]); break; case 3: //求和:三個數 return $this->sum3($args[0], $args[1], $args[2]); break; } } } /** * 利用魔術方法__callStatic實現偽重載。。。 * @return [type] [description] */ public static function __callStatic($name, $args) { if ($name === "area") { switch (count($args)) { case 1: //計算圓的面積 return self::areaCircle($args[0]); break; case 2: //計算矩形的面積 return self::areaRectangle($args[0], $args[1]); break; } } } /** * 計算圓的面積 * @param [type] $r [description] * @return [type] [description] */ public static function areaCircle($r) { return pi() * $r * $r; } /** * 計算矩形的面積 * @param [type] $length [description] * @param [type] $width [description] * @return [type] [description] */ public static function areaRectangle($length, $width) { return $length * $width; } /** * 求和:兩個數 * @param [type] $num1 [description] * @param [type] $num2 [description] * @return [type] [description] */ public function sum2($num1, $num2) { return $num1 + $num2; } /** * 求和:三個數 * @param [type] $length [description] * @param [type] $width [description] * @return [type] [description] */ public function sum3($num1, $num2, $num3) { return $num1 + $num2 + $num3; }}//測試開始echo Tools::area(2) . "
";echo Tools::area(2, 4) . "
";$tools = new Tools();echo $tools->sum(2, 3) . "
";echo $tools->sum(2, 3, 4) . "
";