2015-06-25 65 views
3

我的代碼這樣的:__callStatic不會調用,如果存在一個非靜態函數

<?php 

class A { 

    public function CallA() 
    { 
     echo "callA" . PHP_EOL; 
    } 

    public static function CallB() 
    { 
     echo "callB" . PHP_EOL; 
    } 

    public static function __callStatic($method, $args) 
    { 
     echo "callStatic {$method}"; 
    } 
} 

A::CallA(); 

但它會響應:

Strict Standards: Non-static method A::CallA() should not be called statically in /vagrant/hades_install/public/test.php on line 21 
callA 

也就是說,CallA不運行的功能__callStatic

我該怎麼辦,如果我想__callStatic被稱爲A::CallA()

+0

如果*可以*變成受保護的或私有的'CallA'然後你會看到__callStatic()如預期''火之前'CallA'公衆訪問,但這意味着如果沒有'__callStatic()','CallA'就不能被調用......這個難題! –

+0

PHP中方法的'static'關鍵字或多或少只是建議性的。它根本不影響通話行爲。 – deceze

回答

4

由於documentation解釋說:

__callStatic()在靜態情況下無法訪問調用方法時被觸發。

的方法CallA()在你的代碼訪問的,這就是爲什麼PHP不使用__callStatic()並呼籲CallA()直接是其唯一的選擇。

您可以通過使強制__callStatic()調用CallA()無法訪問(重命名或更改其可見性protectedprivate),或通過直接調用它(醜陋的解決方法):如果你選擇做

A::__callStatic('CallA', array()); 

CallA()保護您需要實現的方法__call()能夠再次調用CallA()

class A { 

    protected function CallA() 
    { 
     echo "callA" . PHP_EOL; 
    } 

    public static function CallB() 
    { 
     echo "callB" . PHP_EOL; 
    } 

    public static function __callStatic($method, $args) 
    { 
     echo "callStatic {$method}" . PHP_EOL; 
    } 

    public function __call($method, $args) 
    { 
     if ($method == 'CallA') { 
      $this->CallA(); 
     } 
    } 
} 

A::CallA(); 
A::__callStatic('CallA', array()); 

$x = new A(); 
$x->CallA(); 

它輸出:

callStatic CallA 
callStatic CallA 
callA 
2

另一種方法是靜態地調用它的時候,內__callStatic解決方法名,以保持非靜態方法完好,使用前綴。

class A { 

    public function CallA() 
    { 
     echo "callA" . PHP_EOL; 
    } 

    public static function __callStatic($method, $args) 
    { 
     $method_name = ltrim($method, '_'); 
     echo "callStatic {$method_name}" . PHP_EOL; 

     $instance = new A(); 
     return instance->$method_name(...$args); //this only works in PHP 5.6+, for earlier versions use call_user_func_array 
    } 

} 

A::_CallA(); 

這將輸出:

callStatic callA 
callA 
相關問題