Diese Situation kommt besonders häufig in Larave vor, aber während des Entwicklungsprozesses ist es offensichtlich, dass einige davon nicht statisch sind. Wenn Sie beispielsweise ein Modellbenutzer verwenden, ist es jedes Mal, wenn Sie es instanziieren, ein völlig neues Hier wird eine magische Methode __callStatic verwendet.
Zum Beispiel:
<?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
Natürlich ist die Magic-Methode auch eine sehr leistungsintensive Methode. Bei jedem Aufruf wird sie nur dann aufgerufen, wenn die Klasse gescannt wird und keine Methode gefunden wird Aus Gründen der Sauberkeit und Einfachheit des Codes kann das Abstrahieren dieser Methode ebenfalls hilfreich sein, es muss jedoch ein Kompromiss zwischen ihnen bestehen. Die unten implementierte Protokollklasse übernimmt diese Methode und kann aufgerufen werden, solange sie erfüllt ist die angegebene Schnittstelle.
<?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-Video-Tutorial
Das obige ist der detaillierte Inhalt vonSo verwenden Sie die Funktion __callStatic in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!