2017-03-27 1 views
-1

私は1つの抽象クラスを作成し、2つのパブリック関数と1つの抽象関数を宣言しました。 その後、私は抽象クラスで公開関数のボディを作成しましたが、このクラスを別のクラスに拡張すると、メソッド本体が呼び出さないものがあります。次に、ボディクラスでのpublicメソッドの使用について知りたいと思います。phpの抽象クラスでbodyを使ったpublic関数の使い方は?

<?php 
     //declare abstract class 
     abstract class Test { 

    // declare method 1 with body 
      public function method1() 
      { 
       echo "hello"; //what is use of this code here 
      } 

      public function method2() 
      { 
       $this->method3(); 
      } 

      abstract public function method3(); 
     } 

     //extended abstract class to another class 
     class AnotherTest extends Test{ 

      public function method1(){ 
       echo "5+9"/2; 
      } 

      public function method3(){ 
       echo 2+9; 
      } 

      public function method2() 
      { 
       echo "just for testing"; 
      } 
     } 

     $obj = new AnotherTest(); 

     $obj->method1(); 
     echo nl2br("\n"); 
     $obj->method3(9,10); 
      echo nl2br("\n"); 
     $obj->method2(); 
     ?> 
+0

もしあなたがそれらを上書きしなければ、 'Test'で宣言したメソッドを呼び出すでしょう。しかし、なぜ、どうやってこれが動作するのかを完全に理解するために、オブジェクト指向についてもう少し詳しく読むべきです。 – JensV

+0

行きたいRTM http://php.net/manual/en/language.oop5.abstract.php –

答えて

0

通常、すべての抽象メソッドは通常overrideではありません。あなたがしている場合、あなたは何か間違っているし、リファクタリングする必要があります。

また、抽象的な(または任意の拡張されたクラス)を持つと、parent::function()を呼び出すことができます。これにより、親メソッドが実行され、現在のクラスを追加ロジックとして実行できます。

最後にこれはPolymorphismの基本です。子クラスは親を拡張することはできますが、メソッドの振る舞いを変更することによって異なる動作をすることができます。

あなたの "テスト"はちょうど悪い例です。そのような場合は、抽象的なボディがほとんど無意味なので、妥当です。

0

基本クラスのメソッドのメソッド本体を記述すると、そのメソッドをオーバーライドしないサブクラスでそのメソッドの "デフォルト"の動作が提供されます。あなたは、次のいずれかを行うことができ、基本クラスのいずれかの(非finalpublicまたはprotected方法については

  • は、同じ名前のメソッドを定義しないことによって変更することなく、そのデフォルトの動作を受け入れますサブクラス
  • オーバーライドして、サブクラスに
  • オーバーライドparent::methodName()を呼び出して、同じ名前で新しいメソッドを定義することによって、その行動をラップし、を呼び出すことはありません同じ名前で新しいメソッドを定義することによって、その動作を置き換えますサブクラス

このように記述されたコードの主な利点は、Polymorphismを利用して特定の実装にジェネリックメソッド呼び出しをディスパッチすることです。 メソッド本体を抽象化のままにするのではなく、定義するだけでデフォルトの動作が得られます。これは非常に抽象的なオブジェクト指向プログラミングのコンセプトなので、簡単で簡単な例ではありません。このコンセプトの具体例としては、Laravel FrameworkやさまざまなSymfony componentsのうちの1つなどの人気のあるコードベースを見るのが最適です。

関連する問題