看到下面的寫法,不是很懂,call_user_func_array函數有什麼不好的地方嗎?為什麼要寫那麼多直接調用的代碼?
public static function invokeMethod($func, array &$params = array()) { list($class, $method) = $func; $instance = is_object($class); switch (count($params)) { case 0: return ($instance) ? $class->$method() : $class::$method(); case 1: return ($instance) ? $class->$method($params[0]) : $class::$method($params[0]); case 2: return ($instance) ? $class->$method($params[0], $params[1]) : $class::$method($params[0], $params[1]); case 3: return ($instance) ? $class->$method($params[0], $params[1], $params[2]) : $class::$method($params[0], $params[1], $params[2]); case 4: return ($instance) ? $class->$method($params[0], $params[1], $params[2], $params[3]) : $class::$method($params[0], $params[1], $params[2], $params[3]); case 5: return ($instance) ? $class->$method($params[0], $params[1], $params[2], $params[3], $params[4]) : $class::$method($params[0], $params[1], $params[2], $params[3], $params[4]); default: return call_user_func_array($func, $params); } }
直接用最後一句return call_user_func_array($func, $params);不就可以了嗎?請多指教,小弟實在是不太瞭解。
回複內容:
看到下面的寫法,不是很懂,call_user_func_array函數有什麼不好的地方嗎?為什麼要寫那麼多直接調用的代碼?
public static function invokeMethod($func, array &$params = array()) { list($class, $method) = $func; $instance = is_object($class); switch (count($params)) { case 0: return ($instance) ? $class->$method() : $class::$method(); case 1: return ($instance) ? $class->$method($params[0]) : $class::$method($params[0]); case 2: return ($instance) ? $class->$method($params[0], $params[1]) : $class::$method($params[0], $params[1]); case 3: return ($instance) ? $class->$method($params[0], $params[1], $params[2]) : $class::$method($params[0], $params[1], $params[2]); case 4: return ($instance) ? $class->$method($params[0], $params[1], $params[2], $params[3]) : $class::$method($params[0], $params[1], $params[2], $params[3]); case 5: return ($instance) ? $class->$method($params[0], $params[1], $params[2], $params[3], $params[4]) : $class::$method($params[0], $params[1], $params[2], $params[3], $params[4]); default: return call_user_func_array($func, $params); } }
直接用最後一句return call_user_func_array($func, $params);不就可以了嗎?請多指教,小弟實在是不太瞭解。
執行效率的原因。在php中,使用“變數函數”(variiable function
)會比call_user_func()
慢,而call_user_func_array()
比call_user_func()
還要更慢。
相關的benchmark如下:
# Benchmark (2 million iterations)# Operation Seconds# Literal function 1.218# Variable function 1.305# call_user_func() 2.734# call_user_func_array() 3.386
可以看到,變數函數和普通函數調用(literal function
)速度差別不大,和call_user_func
相差有一倍以上,而call_user_func_array
則要更慢。所以你給的代碼才會盡量避免使用call_user_func_array
而更傾向於使用變數函數。因為只有很少的函數會有5個以上的參數,所以上面代碼裡才把1到5個函數的調用用變數函數來寫,而只留下小部分的函數用call_user_func_array
調用,從而最大的加快程式執行速度。
其實,這些函數的效率差異不會有想象的那麼大,上面的benchmark是迭代200萬次的結果,如果你的程式只會調用'call_user_func_array'幾千次或以下,這些差異將會非常小(大概是0.002秒左右),沒必要在這些地方做最佳化。
Benchmark連結:
http://www.garfieldtech.com/blog/benchmarking-magic
$func這個參數約定了第一次參數是數組包含兩個參數類或類的執行個體以及方法名,也有可能傳函數名進來
所以除了call_user_func_array是執行函數以外,其他都是執行類的方法或類的靜態方法