ホームページ >バックエンド開発 >PHPチュートリアル >PHPでの関数やコンストラクタのオーバーロード例の実装方法を詳しく解説

PHPでの関数やコンストラクタのオーバーロード例の実装方法を詳しく解説

伊谢尔伦
伊谢尔伦オリジナル
2017-07-08 09:40:301663ブラウズ

PHP は弱い型指定言語であるため、関数の入力パラメーターの型を決定できません (型ヒントは使用できますが、整数、string などのスカラー型には型ヒントを使用できません)。たとえば、関数は 3 つの入力パラメータのみを定義しますが、PHP は呼び出し時に 4 つ以上のパラメータを入力します。したがって、これら 2 つの点に基づいて、PHP では関数をオーバーロードすることはできず (Javascript 言語と同様)、また、コンストラクター のオーバーロードもできません。

関数のオーバーロードの実装は開発効率の向上に非常に役立つので、C#やC++のようにできると良いですね。実際、PHP は、混合呼び出し (文字列名、配列引数) という マジック メソッド を提供します。このメソッドはphpマニュアルにも記載されており、公式ドキュメントによると、このメソッドで関数のオーバーロードが実現できるとされています。オブジェクト内に存在しないメソッドを呼び出す場合、call()メソッドが定義されていればそのメソッドが呼び出されます。たとえば、次のコード:

<?php
class A
{
   function call ( $name, $arguments )
    {
        echo "call调用<br/>";
        echo &#39;$name为&#39;.$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==&#39;f&#39;)
        {
            $i=count($args);
            if (method_exists($this,$f=&#39;f&#39;.$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(&#39;a&#39;);
(new A)->f(&#39;a&#39;,&#39;b&#39;);
(new A)->f(&#39;a&#39;,&#39;b&#39;,&#39;c&#39;);
输出如下:
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=&#39;construct&#39;.$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(&#39;a&#39;);
$o = new A(&#39;a&#39;,&#39;b&#39;);
$o = new A(&#39;a&#39;,&#39;b&#39;,&#39;c&#39;);
?>

コンストラクタを実行
1パラメータa
コンストラクタを実行
2パラメータa,b
コンストラクタを実行
3パラメータa,b,c

ちなみに、c#などです。 オブジェクト指向同じ言語である PHP では、コンストラクターが private または protected に設定されている場合、オブジェクトをインスタンス化できません。

以上がPHPでの関数やコンストラクタのオーバーロード例の実装方法を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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