2015-07-01 46 views
2

使用PHP的神奇函數012_3_CallStatic_和定義靜態函數是否有任何性能差異。__callStatic與PHP的靜態函數

例子:

class Welcome{ 

public static function __callStatic($method, $parameters){ 
    switch ($method) { 
    case 'functionName1': 
     // codes for functionName1 goes here 
    break; 
    case 'functionName2': 
     // codes for functionName2 goes here 
    break; 
    } 
} 

} 

VS

class Welcome{ 

public static function functionName1{ 
    //codes for functionName1 goes here 
} 
public static function functionName1{ 
    //codes for functionName1 goes here 
} 

} 
+0

__callStatic()在調用靜態上下文中不可訪問的方法時被觸發。 – DDeme

+0

我知道,但我的問題是推薦哪種方法?爲什麼? – ArioCC

回答

3

如果你只是在談論速度,這是很容易的測試:

class Testing 
{ 
     private static $x = 0; 

     public static function f1() 
     { 
       self::$x++; 
     } 
     public static function f2() 
     { 
       self::$x++; 
     } 
     public static function __callStatic($method, $params) 
     { 
       switch ($method) { 
         case 'f3': 
           self::$x++; 
           break; 
         case 'f4': 
           self::$x++; 
           break; 
       } 
     } 
} 

$start = microtime(true); 
for ($i = 0; $i < 1000000; $i++) { 
     Testing::f1(); 
     Testing::f2(); 
} 
$totalForStaticMethods = microtime(true) - $start; 

$start = microtime(true); 
for ($i = 0; $i < 1000000; $i++) { 
     Testing::f3(); 
     Testing::f4(); 
} 
$totalForCallStatic = microtime(true) - $start; 

printf(
    "static method: %.3f\n__callStatic: %.3f\n", 
    $totalForStaticMethods, 
    $totalForCallStatic 
); 

我得到static method: 0.187__callStatic: 0.812,所以定義實際方法的速度要快4倍以上。

我也會說,使用__callStatic是不好的風格,除非你有一個很好的理由。它使跟蹤代碼變得更加困難,並且IDE提供自動完成功能的時間更加困難。也就是說,有很多案例值得。

+0

有道理,謝謝:) – ArioCC