0

PHP が子クラスの親から関数を呼び出すことに関して、ひっかけ問題があります。3 つのシナリオがあり、長所と短所が必要です。

<?php
class test{
   private $var ;
   public function __construct(){
    $this->var = 'Hello world';
   }

   public function output(){
      echo $var.'<br>';
   }
}
//scenario 1
class test1 extends test{
   public function __construct(){
    parent::__construct();
   }
   public function say(){
    parent::output();
   }
}
//scenario 2
class test2 extends test{
   public function __construct(){
    test::__construct();
   }
   public function say(){
    test::output();
   }
}
//scenario 3
class test3 extends test{
    private $handle ;
    public function __construct(){
     $this->handle = new test();
    }
    public function say(){
     $this->handle->output();
    }
}
//finally I can call any 3 cases by one of the below codes
$test1 = new test1();
$test1->say();
//or
$test2 = new test2();
$test2->say();
//or
$test3 = new test3();
$test3->say();
?>

ベスト プラクティスはありますか、それとも 3 つのシナリオのいずれかが他よりも優れていますか?

前もって感謝します。

4

2 に答える 2

1

1) 正しい

2) メソッドを静的メソッドのように呼び出すのは正しくありません。

3) コンストラクターで拡張および作成する意味はありません。

于 2013-04-06T08:54:47.377 に答える
0

1) メソッドから親を呼び出すため、これは正しいです。

class test1 extends test{
   public function __construct(){
    parent::__construct();
   }
   public function say(){
    parent::output();
   }
}

2) ここでの継承は不要です。この実装を選択した場合は、両方を変更してoutputメソッドを構築する必要があります。

//scenario 2
class test2 extends test{
   public function __construct(){
    test::__construct();
   }
   public function say(){
    test::output();
   }
}

3) ここからの継承も不要です。ここでは、「コンポーネント オーバー 継承」パターンを使用していることに注意してください。これは、柔軟性が向上するため、優れたプラクティスですが、「拡張テスト」を削除する必要があります。

//scenario 3
class test3 extends test{
    private $handle ;
    public function __construct(){
     $this->handle = new test();
    }
    public function say(){
     $this->handle->output();
    }
}
于 2013-04-06T09:13:56.820 に答える