phpの擬似オーバーロードに関する話題をインターネット上で時々見かけ、興味を持って勉強していました。以下の著者は、PHP が func_get_arg、func_get_args、および func_num_args を使用して関数の疑似オーバーロードを実装する方法について説明します。
まず、メソッドのオーバーロードの利点について話しましょう:
メソッドのオーバーロードを実装するために、異なるパラメーターの型やパラメーターの数に対して複数の関数を作成する必要はありません。複数の関数は同じ名前を使用しますが、呼び出し時にパラメーターのリスト、つまりパラメーターの数または (および) データ型が異なる場合があります。メソッド名は同じでも、対応する関数はそれに応じて自動的に呼び出されます。パラメータリスト。 Microsoft によって作成された .net 基本クラス ライブラリをリフレクターを使用してチェックすると、多くのメソッドのオーバーロードが使用されていることがわかります。そのため、それを呼び出すときに、それほど多くのメソッド名を覚える必要はありませんが、メソッド 関数はさまざまなパラメータを直接渡すことができ、コンパイラはどのメソッドを呼び出したかを明確に認識します。
しかし、PHP には関数のオーバーロードの概念がないため、多くの場合、次のような関連する問題を解決するために、関数の後に N 個のパラメーターを定義する必要さえあります。 func_get_arg、func_get_args、func_num_args は、関連する問題を直接解決できます。具体的なコード例は次のとおりです:
<?php function testOne($a) { echo ('一个参数就这样 '); } function testTwo($a, $b) { echo ('两个参数的就这样 '); } function testThree($a, $b, $c) { echo ('呵呵,这是三个参数的 '); } function test() { $argNum = func_num_args(); // 这一段其实可以用 $_arg = func_get_args() 来获得所有的参数,只是要用数组而已,不方便我下面的表达,呵呵 for ($i = 0; $i < $argNum; $i++) { $_arg_{$i} = func_get_arg($i); } switch ($argNum) { case 1 : testOne($_arg_1); break ; case 2 : testTwo($_arg_1, $_arg_2); break ; case 3 : testThree($_arg_1, $_arg_2, $_arg_3); break ; default : echo (' 这是没有参数的情况 '); break ; } } /** * 例子的实现 */ test(); echo ('<br>'); test(1); echo ('<br>'); test(1, 2); echo ('<br>'); test(1, 2, 3); // 这些只是在函数中的运用,其实最主要的还是在类中的运用 // 如果这些用到类里面我就不需要担心构造函数是否有几个参数了,不是吗? // 类里面的运用只举一个简单的例子 class test{ var $a = 0; var $b = 0; function test() { $argNum = func_num_args(); $_arg = func_get_args(); switch ($argNum) { case 1 : $this->test1($_arg[0]); break ; case 2 : $this->test2($_arg[0], $_arg[1]); break; default : $this->a = 0; $this->b = 1; break; } } function test1($a) { $this->a = $a; } function test2($a, $b) { $this->a = $a; $this->b = $b ; } }