Heim  >  Artikel  >  Backend-Entwicklung  >  Konzentrieren Sie sich auf den zweiten Parameter der PHP-Methode __call()

Konzentrieren Sie sich auf den zweiten Parameter der PHP-Methode __call()

PHPz
PHPzOriginal
2023-04-12 09:16:57633Durchsuche

Eine der magischen Methoden von PHP ist __call(). Die Methode __call() wird verwendet, um eine nicht vorhandene Methode automatisch aufzurufen. Diese Methode ist in einer Klasse definiert. Wenn ein Objekt eine nicht vorhandene Methode oder eine Methode mit unzureichenden Berechtigungen aufruft, ruft das System automatisch die Methode __call() auf. Die Methode __call() akzeptiert zwei Parameter: Methodenname und Parameterliste. In diesem Artikel konzentrieren wir uns auf den zweiten Parameter der __call()-Methode, nämlich die Parameterliste.

Verwendung der Methode __call()

In PHP ist das Definitionsformat der Methode __call() wie folgt:

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

Der Parameter $name ist der Name der aufgerufenen Methode und der Parameter $arguments ist das übergebene Parameterarray zur Methode.

Hier ist ein Beispiel:

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

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

In diesem Beispiel definieren wir eine MyClass-Klasse, die über eine __call()-Methode verfügt, um Methodenaufrufe zu verarbeiten, die in der Klasse nicht vorhanden sind. Wir erstellen ein Objekt von MyClass und rufen seine hello()-Methode auf. Da die Methode hello() in der Klasse MyClass nicht vorhanden ist, ruft das System automatisch die Methode __call() auf und übergibt den Methodennamen hello und die Parameterliste ["World", 123] als Parameter an die Methode __call(). Die __call()-Methode gibt die folgenden Ergebnisse aus:

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

Parameterliste der __call()-Methode

In der __call()-Methode ist der zweite Parameter $arguments ein Array, das alle von der aufgerufenen Methode übergebenen Parameter enthält. Diese Parameter werden in $arguments als Array gespeichert. Innerhalb der Methode __call() können wir Code ähnlich dem folgenden verwenden, um diese Parameter abzurufen:

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

In diesem Beispiel verwenden wir die Funktion count(), um die Anzahl der Parameter zu zählen, und verwenden dann eine for-Schleife, um die auszugeben Parameter nacheinander.

Anwendungsszenarien magischer Methoden

Durch die Verwendung der __call()-Methode können wir unsere Klassen flexibler und einfacher erweiterbar machen. Wenn die definierte Klasse Methoden dynamisch aufrufen muss, kann uns die Methode __call() eine große Hilfe sein. Hier sind einige Anwendungsszenarien für die __call()-Methode:

  1. Dynamisches Aufrufen von Methoden für Objekte

Webanwendungen haben normalerweise viele verschiedene Module und Operationen. Wenn die definierte Klasse Methoden dynamisch aufrufen muss, ist es besser, __call() zu verwenden. Zum Beispiel:

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>';

Das Ausgabeergebnis ist:

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

Durch Aufrufen der Methode __call() können wir Methodenaufrufe in der Klasse dynamisch implementieren und nicht vorhandene Methodenaufrufe einheitlich verarbeiten.

  1. Schnittstellenklassenerweiterung implementieren

Manchmal müssen wir der vorhandenen Codebasis neue Methoden hinzufügen, aber die vorhandenen Klassen können nicht direkt geändert werden. In diesem Fall können Sie die Methode __call() verwenden, um eine Delegate-Methode zu implementieren und den Aufruf an eine andere Klasse weiterzuleiten. Zum Beispiel:

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');

In diesem Beispiel definieren wir eine Schnittstelle InterfaceA und eine Klasse ClassA, die sie implementiert. Dann haben wir eine ClassB-Klasse definiert und die __call()-Methode darin implementiert, wobei wir die Delegation verwendet haben, um die ClassA-Methode aufzurufen. Schließlich erstellen wir ein Objekt von ClassB und rufen dessen Methode sayHello() auf. Da die Methode sayHello() nicht in ClassB implementiert ist, ruft das System automatisch die Methode __call() auf und übergibt den Methodennamen und die Methodenparameter als Parameter. Die Methode __call() entspricht hier einem Repeater.

Zusammenfassung

In diesem Artikel haben wir eine sehr praktische magische Methode __call() in PHP vorgestellt. Wir haben etwas über die Definition der Methode __call(), ihren Aufruf und die Rolle der Parameterliste gelernt. Durch die Verwendung der Methode __call() können wir einer Klasse die Möglichkeit hinzufügen, Methoden dynamisch aufzurufen, wodurch unser Programm flexibler und einfacher erweiterbar wird. Durch diesen Artikel sollten Sie die Methode __call() besser verstehen und sie besser in der Praxis anwenden können.

Das obige ist der detaillierte Inhalt vonKonzentrieren Sie sich auf den zweiten Parameter der PHP-Methode __call(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn