Maison  >  Article  >  développement back-end  >  Focus sur le deuxième paramètre de la méthode PHP __call()

Focus sur le deuxième paramètre de la méthode PHP __call()

PHPz
PHPzoriginal
2023-04-12 09:16:57633parcourir

L'une des méthodes magiques de PHP est __call(). La méthode __call() permet d'appeler automatiquement une méthode qui n'existe pas. Cette méthode est définie dans une classe. Lorsqu'un objet appelle une méthode qui n'existe pas ou dont les autorisations sont insuffisantes, le système appellera automatiquement la méthode __call(). La méthode __call() accepte deux paramètres : le nom de la méthode et la liste des paramètres. Dans cet article, nous nous concentrerons sur le deuxième paramètre de la méthode __call(), qui est la liste des paramètres.

Utilisation de la méthode __call()

En PHP, le format de définition de la méthode __call() est le suivant :

public function __call($name, $arguments)
{
    //处理调用$name方法时传递的$arguments参数
}

Le paramètre $name est le nom de la méthode appelée, et le paramètre $arguments est le tableau de paramètres passé à la méthode.

Voici un exemple :

class MyClass
{
    public function __call($name, $arguments)
    {
        echo "调用方法 $name() 时,传递了以下参数:";
        print_r ($arguments);
    }
}

$obj = new MyClass();
$obj->hello("World", 123);

Dans cet exemple, nous définissons une classe MyClass qui a une méthode __call() pour gérer les appels de méthode qui n'existent pas dans la classe. Nous créons un objet de MyClass et appelons sa méthode hello(). Puisque la méthode hello() n'existe pas dans la classe MyClass, le système appellera automatiquement la méthode __call() et transmettra le nom de la méthode hello et la liste de paramètres ["World", 123] comme paramètres à la méthode __call(). La méthode __call() affichera les résultats suivants :

调用方法 hello() 时,传递了以下参数:Array ( [0] => World [1] => 123 )

Liste des paramètres de la méthode __call()

Dans la méthode __call(), le deuxième paramètre $arguments est un tableau qui contient tous les paramètres passés par la méthode appelée. Ces paramètres sont stockés dans $arguments sous forme de tableau. Dans la méthode __call(), nous pouvons utiliser un code similaire au suivant pour obtenir ces paramètres :

public function __call($name, $arguments)
{
    $arg_count = count($arguments);
    for($i=0; $i<$arg_count; $i++){
        echo $arguments[$i]."<br>";
    }
}

Dans cet exemple, nous utilisons la fonction count() pour compter le nombre de paramètres, puis utilisons une boucle for pour afficher le paramètres un par un.

Scénarios d'application des méthodes magiques

En utilisant la méthode __call(), nous pouvons rendre nos classes plus flexibles et plus faciles à étendre. Lorsque la classe définie a besoin d'appeler dynamiquement des méthodes, la méthode __call() peut nous être d'une grande aide. Voici quelques scénarios d'application pour la méthode __call() :

  1. Appel dynamique de méthodes sur des objets

Les applications Web ont généralement de nombreux modules et opérations différents. Lorsque la classe définie doit appeler dynamiquement des méthodes, il est plus approprié d'utiliser __call(). Par exemple :

class Show    
{    
    public function showtext() {    
        return '这是一个文本框';    
    }    
    public function showbutton() {    
        return '这是一个按钮';    
    }    
    public function showselect() {    
        return '这是一个下拉列表';    
    }   
    public function __call($name, $arguments) {    
        return '您调用的方法:'.$name.'(参数:'.implode(',',$arguments).')不存在';    
    }    
}  
$obj = new Show();  
echo $obj->showText().'<br>';    
echo $obj->showButton().'<br>';    
echo $obj->showSelect('',2,3).'<br>';    
echo $obj->test('param1',2).'<br>';

Le résultat de sortie est :

这是一个文本框
这是一个按钮
这是一个下拉列表
您调用的方法:test(参数:param1,2)不存在

En appelant la méthode __call(), nous pouvons implémenter dynamiquement les appels de méthode dans la classe et gérer uniformément les appels de méthode inexistants.

  1. Implémenter une extension de classe d'interface

Parfois, nous devons ajouter de nouvelles méthodes à la base de code existante, mais les classes existantes ne peuvent pas être modifiées directement. Dans ce cas, vous pouvez utiliser la méthode __call() pour implémenter une méthode déléguée et transmettre l'appel à une autre classe. Par exemple :

interface InterfaceA{ 
    public function sayHello($name); 
}

class ClassA implements InterfaceA { 
  public function sayHello($name){                  
      echo 'ClassA: Hello,'.$name.'<br>';                      
  } 
} 

class ClassB { 
  public function __call($name,$arguments){                  
      if($name == 'sayHello'){                     
        $obj = new ClassA(); 
        return $obj->sayHello($arguments[0]); 
      } 
  }   
} 

$obj = new ClassB(); 
$obj->sayHello('World');

Dans cet exemple, nous définissons une interface InterfaceA et une classe ClassA qui l'implémente. Ensuite, nous avons défini une classe ClassB et y avons implémenté la méthode __call(), en utilisant la délégation pour appeler la méthode ClassA. Enfin, nous avons créé un objet de ClassB et appelé sa méthode sayHello(). Puisque la méthode sayHello() n'est pas implémentée dans ClassB, le système appellera automatiquement la méthode __call() et transmettra le nom de la méthode et les paramètres de la méthode en tant que paramètres. La méthode __call() est ici équivalente à un répéteur.

Résumé

Dans cet article, nous avons présenté une méthode magique très pratique __call() en PHP. Nous avons découvert la définition de la méthode __call(), comment l'appeler et le rôle de la liste de paramètres. En utilisant la méthode __call(), nous pouvons ajouter la possibilité d'appeler dynamiquement des méthodes à une classe, ce qui peut rendre notre programme plus flexible et plus facile à développer. Grâce à cet article, vous devriez avoir une meilleure compréhension de la méthode __call() et être capable de mieux l'appliquer dans la pratique.

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