ホームページ  >  記事  >  バックエンド開発  >  PHP __call() メソッドの 2 番目のパラメータに注目してください。

PHP __call() メソッドの 2 番目のパラメータに注目してください。

PHPz
PHPzオリジナル
2023-04-12 09:16:57633ブラウズ

PHP の魔法のメソッドの 1 つは __call() です。 __call() メソッドは、存在しないメソッドを自動的に呼び出すために使用されます。このメソッドはクラスで定義されており、オブジェクトが存在しないメソッド、または権限が不十分なメソッドを呼び出すと、システムは自動的に __call() メソッドを呼び出します。 __call() メソッドは、メソッド名とパラメーター リストの 2 つのパラメーターを受け入れます。この記事では、__call() メソッドの 2 番目のパラメーターであるパラメーター リストに焦点を当てます。

__call() メソッドの使用法

PHP では、__call() メソッドの定義形式は次のとおりです。

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

$name パラメータは、呼び出されるメソッドの名前です。 $arguments パラメータはメソッドに渡されるパラメータ配列です。

次は例です:

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

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

この例では、クラス内に存在しないメソッド呼び出しを処理する __call() メソッドを持つ MyClass クラスを定義します。 MyClass のオブジェクトを作成し、その hello() メソッドを呼び出します。 hello() メソッドは MyClass クラスに存在しないため、システムは自動的に __call() メソッドを呼び出し、メソッド名 hello とパラメータ リスト ["World", 123] をパラメータとして __call() メソッドに渡します。 __call() メソッドは次の結果を出力します。

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

__call() メソッドのパラメータ リスト

__call() メソッドの 2 番目のパラメータ $arguments は、All を含む配列です。呼び出されたメソッドによって渡されるパラメータ。これらのパラメータは $arguments に配列として保存されます。 __call() メソッド内で、次のようなコードを使用してこれらのパラメーターを取得できます。

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

この例では、count() 関数を使用してパラメーターの数をカウントし、次に for を使用します。ループしてパラメータを 1 つずつ出力します。

マジック メソッドのアプリケーション シナリオ

__call() メソッドを使用すると、クラスをより柔軟で簡単に拡張できます。定義されたクラスが動的にメソッドを呼び出す必要がある場合、 __call() メソッドが大きな助けとなります。 __call() メソッドのいくつかのアプリケーション シナリオを次に示します。

  1. オブジェクトを呼び出す動的メソッド

Web アプリケーションには通常、さまざまなモジュールと操作が含まれます。定義されたクラスがメソッドを動的に呼び出す必要がある場合は、__call() を使用する方が適切です。例:

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

出力結果は次のとおりです:

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

__call() メソッドを呼び出すことにより、クラス内でメソッド呼び出しを動的に実装し、存在しないメソッド呼び出しを均一に処理できます。

  1. インターフェイス クラス拡張の実装

既存のコード ベースに新しいメソッドを追加する必要がある場合がありますが、既存のクラスを直接変更することはできません。この場合、__call() メソッドを使用してデリゲート メソッドを実装し、呼び出しを別のクラスに転送できます。例:

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

この例では、インターフェイス InterfaceA と、それを実装するクラス ClassA を定義します。次に、ClassB クラスを定義し、その中に __call() メソッドを実装し、委任を使用して ClassA メソッドを呼び出します。最後に、ClassB のオブジェクトを作成し、その SayHello() メソッドを呼び出します。sayHello() メソッドは ClassB に実装されていないため、システムは自動的に __call() メソッドを呼び出し、メソッド名とメソッド パラメータをパラメータとして渡します。ここでは、__call() メソッドがフォワーダーに相当します。

概要

この記事では、PHP の非常に実用的なマジック メソッド __call() を紹介しました。 __call() メソッドの定義、呼び出し方法、パラメータ リストの役割について学びました。 __call() メソッドを使用すると、クラスにメソッドを動的に呼び出す機能を追加できるため、プログラムがより柔軟で拡張しやすくなります。この記事を通じて、__call() メソッドをより明確に理解し、実際により適切に適用できるようになります。

以上がPHP __call() メソッドの 2 番目のパラメータに注目してください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。