2011-02-16 32 views
0

我知道這根本不會被注意到,只是爲了學習,是否有調用類方法而不是調用類屬性的開銷,如我在下面的示例中顯示的$ router-> controller和$ router- >行動?請不要過分關注過早優化,只是想了解更多。在PHP中調用Class屬性與Class方法之間的性能?

// Using Class property 
$router = new Router($uri, $uri_route_map); 
$router->dispatch($router->controller, $router->action); 

// Using Class methods instead 
$router = new Router($uri, $uri_route_map); 
$router->dispatch($router->controller(), $router->action()); 

回答

4

$router->controller訪問類屬性,基本上只是讀取的變量。
$router->controller()調用函數。調用一個函數肯定會比讀取一個變量有更多的開銷,特別是因爲函數本身可能會讀取一個變量。

+2

注意,如果路由器::控制器不public,在類之外訪問屬性將導致對__get('controller')的調用(如果存在)。如果在後臺執行字符串操作來確定實際屬性(在Zend Framework中很常見將其轉換爲「_controller」),則它更慢。發生什麼將取決於您正在訪問的課程。 Router :: controller甚至可以是實現`__invoke()`的對象。 – 2011-02-16 03:06:34

3

既然你學習,嘗試一下自己在計時器腳本得到一個粗略的估計:

class MyClass 
{ 
    public $property1 = 'a'; 

    public function method1() 
    { 
     return $this->property1; 
    } 
} 

$mc = new MyClass(); 

$start = 0; $end = 0; 

// property 
$start = microtime(true); 
for ($a=0; $a<10000; $a++) { 
    $mc->property1; 
} 
$end = microtime(true); 
echo $end - $start . "<br />\n"; 

// method 
$start = microtime(true); 
for ($b=0; $b<10000; $b++) { 
    $mc->method1(); 
} 
$end = microtime(true); 
echo $end - $start . "<br />\n"; 

輸出:
0.0040628910064697
0.0082359313964844

+0

感謝這個例子,當設計一個大型應用程序時,這將是很好的知道 – JasonDavis 2011-02-16 06:52:07