2016-10-02 19 views
2

は、私はちょうどこのようなコードを書いた:私は、このエラーの最初の部分を理解抽象クラスメソッドの宣言

Fatal error: Class test contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (test::getValue, test::prefixValue) in C:\wamp64\www\study\abstract.php on line 12

:私はこのコードを実行すると

<?php 
class test 
{ 
// Force Extending class to define this method 
abstract protected function getValue(); 
abstract protected function prefixValue($prefix); 

// Common method 
public function printOut() { 
    print $this->getValue() . "\n"; 
} 
} 
class testabs extends test{ 

public function getValue() 
{ 

} 
public function prefixValue($f) 
{ 

} 
} 
$obj = new testabs(); 
?> 

、私は下のエラーを受け取りました。クラステストをabstractに変更してエラーがなくなりましたが、or部分は分かりません。

+0

_or_部分は、クラスがあなたの 'test'クラスを拡張する観点からのものです。それは両方向に進む。あなたの 'test'クラスを抽象的なものにするか、継承した抽象宣言を実装していないため、' test'抽象を拡張した他のクラスを作ります。 – dbf

答えて

4

抽象メソッドを追加する場合は、クラスabstractも作成する必要があります。そうすれば、クラスをインスタンス化することはできません。非抽象クラスだけが可能です。

visibility(第2サブセクションMethod Visiblilty参照)は、サブクラスでは同じではありません。サブクラス以外のコードでメソッドを呼び出すかどうかに応じて、クラスtestpublicの(抽象)メソッドを作成するか、またはサブクラスのメソッドをprotectedにすることができます。

そして、これを説明しClass Abstraction pageから二番目の段落、注意してください。

When inheriting from an abstract class, all methods marked abstract in the parent's class declaration must be defined by the child; additionally, these methods must be defined with the same (or a less restricted) visibility. For example, if the abstract method is defined as protected, the function implementation must be defined as either protected or public, but not private

<?php 
abstract class test{ 
    // Force Extending class to define this method 
    abstract protected function getValue(); 
    abstract protected function prefixValue($prefix); 

    // Common method 
    public function printOut() { 
     print $this->getValue() . "\n"; 
    } 
} 
class testabs extends test{ 

    protected function getValue() 
    { 

    } 
    /** 
    * this method can be called from other methods with this class 
    * or sub-classes, but not called directly by code outside of this  class 
    **/ 
    protected function prefixValue($f) 
    { 

    } 
} 
$obj = new testabs(); 
// this method cannot be called here because its visibility is protected 
$obj->prefixValues();// Fatal Error 
?> 
+0

オブジェクトを作成するときにエラーが発生しました –

+0

回答を更新しました。新しい最初の段落を参照してください。 –

1

あなたのクラスは抽象機能を持っていますが、2つの選択肢がありますので、抽象として宣言されていませんが。クラスをabstractと宣言するか、抽象関数の実装を提供してください。

最初のオプション(試してみました)は、クラスを存在させ、関数を実装する具体的なサブクラスで使用できるようにします。 2番目のオプションは、クラスが完全に定義され、そのまま使用できることを意味します。

0

classabstractのメソッドがある場合は、abstractと宣言する必要があります。 だから、次は正しいです:抽象クラスインタフェース

<?php 
abstract class test 
{ 
    // Force Extending class to define this method 
    abstract protected function getValue(); 
    abstract protected function prefixValue($prefix); 

    // Common method 
    public function printOut() { 
    print $this->getValue() . "\n"; 
    } 
} 
0

重要な技術的な違いは以下のとおりです。

  • 抽象クラスは、定数、メンバー、メソッド・スタブ(メソッドなしを持つことができますbody)と定義されたメソッドを使用できますが、インタフェースは定数とメソッドスタブのみを持つことができます。
  • 抽象クラスのメソッドとメンバは、どのような可視性でも定義できますが、インタフェースのすべてのメソッドはパブリックとして定義する必要があります(デフォルトではパブリックに定義されています)。
  • 抽象クラスを継承する場合、具体的な子クラスで抽象メソッドを定義する必要がありますが、抽象クラスは別の抽象クラスを拡張でき、親クラスの抽象メソッドを定義する必要はありません。
  • 同様に、別のインタフェースを拡張しているインタフェースは、親インタフェースからメソッドを実装する責任を負いません。これは、インタフェースが実装を定義することができないためです。
  • 子クラスは単一のクラス(抽象または具象)のみを拡張できますが、インタフェースは拡張できますが、クラスは複数の他のインタフェースを実装できます。
  • 子クラスは、同じか、それほど制限の少ない可視性を持つ抽象メソッドを定義することができますが、インタフェースを実装するクラスでは、同じ可視性(public)を持つメソッドを定義する必要があります。
関連する問題