この状況は、larave で特に一般的ですが、開発プロセス中に、これらの一部が静的ではないことは明らかです。たとえば、モデル ユーザーを使用する場合、インスタンス化するたびに、まったく新しいユーザーになります。ここではマジック メソッド __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
もちろん、マジック メソッドも非常にパフォーマンスを重視するメソッドです。呼び出されるたびに、最初にクラスをスキャンしてください。メソッドが見つかった場合にのみ呼び出されます。このメソッドは、コードの簡潔さと抽象化にも役立ちます。これにはトレードオフが必要です。
実装されたログ クラス以下では、この A メソッドを使用し、メソッドを分離します。指定されたインターフェイスを満たす限り、メソッドを呼び出すことができます。
<?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 中国語 Web サイトの他の関連記事を参照してください。