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() メソッドのいくつかのアプリケーション シナリオを次に示します。
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() メソッドを呼び出すことにより、クラス内でメソッド呼び出しを動的に実装し、存在しないメソッド呼び出しを均一に処理できます。
既存のコード ベースに新しいメソッドを追加する必要がある場合がありますが、既存のクラスを直接変更することはできません。この場合、__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 サイトの他の関連記事を参照してください。