Maison  >  Article  >  développement back-end  >  Comment utiliser la fonction __callStatic en php

Comment utiliser la fonction __callStatic en php

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-07-12 15:20:191531parcourir

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.

Comment utiliser la fonction __callStatic en php

Par exemple :

<?php
class Test{
    public function __call($name, $arguments)
    {
        echo &#39;this is __call&#39;. PHP_EOL;
    }

    public static function __callStatic($name, $arguments)
    {
        echo &#39;this is __callStatic:&#39;. 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 &#39;this is Log method info&#39; . PHP_EOL;
        var_dump($content);
    }

    function alert($messge, array $content = [])
    {
        echo &#39;this is Log method alert: &#39;. $messge . PHP_EOL;
    }
}


Test::info(&#39;喊个口号:&#39;,[&#39;好好&#39;,&#39;学习&#39;,&#39;天天&#39;,&#39;向上&#39;]);
$test = new Test();
$test->alert(&#39;hello&#39;);

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer