php call_user_func_array函數有什麼不好的地方嗎?

來源:互聯網
上載者:User
關鍵字 php
看到下面的寫法,不是很懂,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是執行函數以外,其他都是執行類的方法或類的靜態方法

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.