PHP は弱い型指定言語であるため、関数の入力パラメーターの型を決定できません (型ヒントは使用できますが、整数、string などのスカラー型には型ヒントを使用できません)。たとえば、関数は 3 つの入力パラメータのみを定義しますが、PHP は呼び出し時に 4 つ以上のパラメータを入力します。したがって、これら 2 つの点に基づいて、PHP では関数をオーバーロードすることはできず (Javascript 言語と同様)、また、コンストラクター のオーバーロードもできません。
関数のオーバーロードの実装は開発効率の向上に非常に役立つので、C#やC++のようにできると良いですね。実際、PHP は、混合呼び出し (文字列名、配列引数) という マジック メソッド を提供します。このメソッドはphpマニュアルにも記載されており、公式ドキュメントによると、このメソッドで関数のオーバーロードが実現できるとされています。オブジェクト内に存在しないメソッドを呼び出す場合、call()メソッドが定義されていればそのメソッドが呼び出されます。たとえば、次のコード:
<?php class A { function call ( $name, $arguments ) { echo "call调用<br/>"; echo '$name为'.$name."<br/>"; print_r ($arguments); } } (new A)->test("test","argument"); ?>
実行結果は次のようになります:
call call
$name is test
Array ( [0] => test [1] => argument )
したがって、必要なのはこの魔法のメソッドを使用すると、関数のオーバーロードを実現できます。
コードは次のとおりです:
<?php class A { function call ($name, $args ) { if($name=='f') { $i=count($args); if (method_exists($this,$f='f'.$i)) { call_user_func_array(array($this,$f),$args); } } } function f1($a1) { echo "1个参数".$a1."<br/>"; } function f2($a1,$a2) { echo "2个参数".$a1.",".$a2."<br/>"; } function f3($a1,$a2,$a3) { echo "3个参数".$a1.",".$a2.",".$a3."<br/>"; } } (new A)->f('a'); (new A)->f('a','b'); (new A)->f('a','b','c'); 输出如下: 1个参数a 2个参数a,b 3个参数a,b,c
同様に、PHP では、コンストラクターのオーバーロードは柔軟な方法でのみ実装できます。実装の重要な要素は、入力パラメータを取得し、入力パラメータに基づいて呼び出すメソッドを決定することです。以下はサンプルコードです:
<?php class A { function construct() { echo "执行构造函数<br/>"; $a = func_get_args(); //获取构造函数中的参数 $i = count($a); if (method_exists($this,$f='construct'.$i)) { call_user_func_array(array($this,$f),$a); } } function construct1($a1) { echo "1个参数".$a1."<br/>"; } function construct2($a1,$a2) { echo "2个参数".$a1.",".$a2."<br/>"; } function construct3($a1,$a2,$a3) { echo "3个参数".$a1.",".$a2.",".$a3."<br/>"; } } $o = new A('a'); $o = new A('a','b'); $o = new A('a','b','c'); ?>
コンストラクタを実行
1パラメータa
コンストラクタを実行
2パラメータa,b
コンストラクタを実行
3パラメータa,b,c
ちなみに、c#などです。 オブジェクト指向同じ言語である PHP では、コンストラクターが private または protected に設定されている場合、オブジェクトをインスタンス化できません。
以上がPHPでの関数やコンストラクタのオーバーロード例の実装方法を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。