Maison  >  Article  >  développement back-end  >  Comment utiliser la méthode __call() en php et exemple d'analyse de surcharge

Comment utiliser la méthode __call() en php et exemple d'analyse de surcharge

伊谢尔伦
伊谢尔伦original
2017-07-03 11:47:501853parcourir

1. Avant-propos

Note spéciale : bien que la méthode call() ou callStatic() soit conçue pour implémenter la surcharge, pour faciliter la compréhension, les deux sont d'abord comprises séparément ! ! !

Les caractéristiques de la méthode call() sont ses caractéristiques. L'utiliser pour implémenter la surcharge revient à implémenter la surcharge~

2 La méthode call()

.

Après PHP5.3.0, une méthode callStatic() a été ajoutée. Ce sont toutes des méthodes magiques en PHP. Les méthodes dites magiques sont que le système appelle automatiquement à un moment précis méthode ! En plus de ces deux-là, il existe d'autres méthodes magiques en PHP (voir le manuel). Concernant les méthodes magiques, ma compréhension personnelle est que toutes les méthodes magiques ont une chose en commun : elles sont automatiquement appelées par le système. Il y a deux différences : l'heure de l'appel et l'effet après l'appel Concernant le temps d'appel et la fonction de call() et callStatic() (le point populaire est le résultat après l'appel), prenez une châtaigne (le code est le suivant)

La sortie est

<?php
class A {
        public function test () {
                static::who();
                A::who();
                self::who();
                $this->who();
        }

        /**
         *私有方法
        */
        private function test2(){

        }

        public static function callStatic($a, $b) {
                var_dump(&#39;A static&#39;);
        }   
            
        public function call($a, $b) {
                var_dump(&#39;A call&#39;);
        }   
}

$a = new A;
$a->test();
A::test1();
$a->test2();
?>
 

A travers cette châtaigne, il n'est pas difficile de voir deux points

 ·Appelez-en un de cette classe à l'intérieur de la classe

Inaccessible

(S'il est dans cette classe, il ne peut être inaccessible que s'il n'existe pas. S'il est inaccessible en dehors de cette classe, il peut également signifier qu'il n'y a pas d'autorisation d'accès). La méthode objet ou la méthode statique ne peut déclencher que la méthode call()  · C'est pas possible d'appeler un

dans une classe extérieure à la classe Lors de l'accès à la méthode de

, le mode objet déclenche la méthode call(), et le mode statique déclenche la méthode callStatic()  ps, l'inaccessibilité ne veut pas seulement dire que ça n'existe pas

1. Prenons un autre exemple :

La sortie est

class  MethodTest {
    public function call($name,$arguments) 
    {
         // 注意: $name 的值区分大小写
         echo "Calling object method &#39;$name&#39;的参数有多个,分别是:".implode (&#39;、&#39;,$arguments)."<br/>" ;
    }

     /**  PHP 5.3.0之后版本  */
     public static function callStatic($name,$arguments) 
    {
         // 注意: $name 的值区分大小写
         echo  "Calling static method&#39;$name&#39;的参数有多个,分别是:".implode (&#39;、&#39;,$arguments)."<br/>" ;
    }
}

 $obj=new MethodTest ;
 $obj->runTest (&#39;in object context&#39;,&#39;另外一个参数&#39;);

 MethodTest::runTest (&#39;in static context&#39;,&#39;另外一个参数&#39;);   // PHP 5.3.0之后版本

 ·Lorsque la méthode call() ou callStatic() est déclenchée, le système transmettra automatiquement le nom de la méthode inaccessible appelée comme premier paramètre dans call() ou callStatic () Dans la méthode, le paramètre transmis par la méthode inexistante appelée est transmis à l'appel en tant que deuxième paramètre (et il est encapsulé dans un tableau, c'est-à-dire que chaque élément est un paramètre transmis lors de l'appel de la méthode inaccessible. ) () ou méthode callStatic()

 · Ensuite, à l'intérieur de la méthode call ou callStatic(), vous pouvez effectuer certaines opérations basées sur les deux paramètres transmis, qui peuvent être liées à une surcharge !

2. Euh. . . Enfin, donnez une châtaigne

La sortie est

2. Surcharge
class Foo{
        public function call($name,$arguments){

                print("你是想调用$name"."()方法吗? 额...不好意思呦,该方法不可访问!<br/>");
        }
}

$foo=new Foo;

$foo->doStuff();

$foo->doStuff1();

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn