Cette situation est particulièrement courante dans Larave, mais pendant le processus de développement, il est évident que certains d'entre eux ne sont pas statiques. Par exemple, si vous utilisez un utilisateur modèle, chaque fois que vous l'instancierez, ce sera un tout nouveau sans. s'affectant les uns les autres. Voici Une méthode magique __callStatic est utilisée.
Par exemple :
<?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
Bien sûr La méthode magique est également une méthode très gourmande en performances. Chaque fois qu'elle est appelée, elle sera appelée après avoir d'abord analysé la classe et non trouvé la méthode. Cette méthode peut également être d'une grande aide pour la netteté et l'abstraction du code. Ici, il doit y avoir un compromis entre eux
La classe de journal implémentée ci-dessous adopte cette méthode. La méthode est découplée et peut être appelée tant qu'elle répond à l'interface spécifiée
<?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');
Sortie : p >
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
Apprentissage recommandé : tutoriel vidéo php
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!