這種情況在larave中尤其常見,但是開發過程中很明顯這些有一部分不是靜態的,比如你使用一個模型User,那麼你每次實例化出來他都是一個全新的,互不影響,這裡就用到了一個魔術方法__callStatic。
舉個栗子:
<?php class Test{ public function __call($name, $arguments) { echo 'this is __call'. PHP_EOL; } public static function __callStatic($name, $arguments) { echo 'this is __callStatic:'. PHP_EOL; } } $test = new Test(); $test->hello(); $test::hi(); //this is __call:hello //this is __callStatic:hi
當然魔術方法也是很耗性能的一種方式,每次呼叫的時候後回先掃一遍class沒找到方法時才會調用它,而為了代碼的整潔和抽象這個方法也能給很大的幫助,在這之間去要有個權衡
下面實現的log 類,採用的就是這種方法,將方法解耦出來,只要符合規定的介面就能呼叫
<?php class Test{ //获取 logger 的实体 private static $logger; public static function getLogger(){ return self::$logger?: self::$logger = self::createLogger(); } private static function createLogger(){ return new Logger(); } public static function setLogger(LoggerInterface $logger){ self::$logger = $logger; } public function __call($name, $arguments) { call_user_func_array([self::getLogger(),$name],$arguments); } public static function __callStatic($name, $arguments) { forward_static_call_array([self::getLogger(),$name],$arguments); } } interface LoggerInterface{ function info($message,array $content = []); function alert($messge,array $content = []); } class Logger implements LoggerInterface { function info($message, array $content = []) { echo 'this is Log method info' . PHP_EOL; var_dump($content); } function alert($messge, array $content = []) { echo 'this is Log method alert: '. $messge . PHP_EOL; } } Test::info('喊个口号:',['好好','学习','天天','向上']); $test = new Test(); $test->alert('hello');
輸出:
this is Log method info array(4) { [0]=> string(6) "好好" [1]=> string(6) "学习" [2]=> string(6) "天天" [3]=> string(6) "向上" } this is Log method alert: hello
推薦學習:php影片教學
以上是php中的__callStatic函數如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!