5

PHP はメソッドのオーバーロードをサポートしていますか。以下のコードを試している間、メソッドのオーバーロードをサポートしていることを示唆しています。任意のビュー

class test
{
  public test($data1)
  {
     echo $data1;
  }
}

class test1 extends test
{
    public test($data1,$data2)
    {
       echo $data1.' '.$data2;
    }
}

$obj = new test1();
$obj->test('hello','world');

メソッドをオーバーロードすると、出力が「hello world」になります。上記のコード スニペットは、php がメソッドのオーバーロードをサポートしていることを示しています。だから私の質問は、PHPはメソッドのオーバーロードをサポートしていますか?

4

3 に答える 3

10

メソッドのオーバーライド(例)とメソッドのオーバーロードを区別する必要があります

__call マジック メソッドを使用して PHP でメソッドのオーバーロードを実装する方法の簡単な例を次に示します。

class test{
    public function __call($name, $arguments)
    {
        if ($name === 'test'){
            if(count($arguments) === 1 ){
                return $this->test1($arguments[0]);
            }
            if(count($arguments) === 2){
                return $this->test2($arguments[0], $arguments[1]);
            }
        }
    }

    private function test1($data1)
    {
       echo $data1;
    }

    private function test2($data1,$data2)
    {
       echo $data1.' '.$data2;
    }
}

$test = new test();
$test->test('one argument'); //echoes "one argument"
$test->test('two','arguments'); //echoes "two arguments"
于 2013-06-26T09:40:45.677 に答える
1

だから私の質問は、PHPはメソッドのオーバーロードをサポートしていますか(?)。

はい、そうではありません。あなたの例では、少なくともバージョン 5.5.3 とerror_reporting(E_ALL).

そのバージョンでは、このコードを実行しようとすると、次のメッセージが表示されます。

Strict Standards: Declaration of test1::test() should be compatible
with test::test($data1) in /opt/lampp/htdocs/teste/index.php on line 16

Warning: Missing argument 1 for test::test(), called in /opt/lampp/htdocs/teste/index.php 
on line 18 and defined in /opt/lampp/htdocs/teste/index.php on line 4

Notice: Undefined variable: data1 in /opt/lampp/htdocs/teste/index.php on line 6
hello world //it works, but the messages above suggests that it's wrong.
于 2014-03-04T16:58:40.513 に答える
0

どちらの場合も、テストの前に「関数」を追加するのを忘れました。子クラスオブジェクトからメソッドを呼び出すと、最初にそのメソッドが子クラスに存在するかどうかを確認し、そうでない場合は、可視性 public または保護されたチェックで継承された親クラスを調べ、メソッドが存在する場合は、それに応じた結果。

于 2015-10-13T10:47:51.903 に答える