2017-05-27 35 views
2

をインスタンス化することはできません私はという名前抽象データベースクラスがあります。私はそれを使用しようとするとPHP:致命的なエラー:抽象クラスに

abstract class database { 
    protected $value; 
} 

を私は

abstract class my_database extends database { 
    public function set_value($value) { 
    $this->value = $value; 
    } 
} 

を別の抽象クラスを作成しました:

$my_db = new my_database(); 

エラーが発生します:

Fatal error: Cannot instantiate abstract class my_database in ... 

私がしようとしているのは:抽象クラスデータベースに保護された$値があり、保護された値を(一時的に)変更できるように、ラッパークラスを作成したいと考えています。

どうすればいいですか?

EDIT1:私は抽象MY_DATABASEせずにしようとしたとき、残念ながらそれ以前、私はエラーを得た:

- abstract methods and must therefore be declared abstract or implemented 
- Abstract function cannot contain body 

EDIT2:

: MY_DATABASEから完全に抽象的な言葉を取り出した後、私は次のエラーを得ました

Fatal error: Class my_database contains 32 abstract methods and must therefore be declared abstract or implement the remaining methods

どうすればこの問題を解決できますか?

+2

'new(抽象クラ​​ス)'を呼び出すことはできません。このユースケースでは、 'my_database'は抽象的であってはなりません。 – rickdenhaan

+0

抽象クラスはインスタンス化できませんhttp://php.net/manual/en/language.oop5.abstract.php –

+0

抽象クラスはインスタンス化できませんが、サブクラス化することができます。 –

答えて

8

抽象クラスとして定義されたクラスはインスタンス化されないかもしれませんし、少なくとも1つの抽象メソッドを含むクラスも抽象クラスでなければなりません。これについてPHPのマニュアルで読むことができます:link

ここは例です。

抽象クラス(抽象メソッドは、ボディを持っていないことノート - 彼らは身体持つことはできません - それはちょうど署名です)があります:クラスのように、あなたの抽象クラスを拡張

abstract class AbstractClass 
{ 
    // Force Extending class to define this method 
    abstract protected function getValue(); 
    abstract protected function prefixValue($prefix); 

    // Common method. It will be available for all children - they don't have to declare it again. 
    public function printOut() { 
     print $this->getValue() . "\n"; 
    } 
} 

は、この(すべての抽象メソッドは具象クラスで定義されなければならないことを注):

class ConcreteClass1 extends AbstractClass 
{ 
    protected function getValue() { 
     return "ConcreteClass1"; 
    } 

    public function prefixValue($prefix) { 
     return "{$prefix}ConcreteClass1"; 
    } 
} 

次にあなたがConcreteClass1のインスタンスを作成することができます。

$class1 = new ConcreteClass1; 
+1

@klor私の答えをもう一度読む - 「少なくとも1つの抽象メソッドを含むクラスも抽象メソッドでなければならない」 - クラスに抽象メソッドがある場合、抽象クラスを抽象クラスにして、 – arbogastes

+0

致命的なエラー:クラスmy_databaseには32の抽象メソッドが含まれているため、抽象宣言またはその他のメソッドを実装する必要があります – klor

+0

@klorしたがって、クラスmy_databaseは32の抽象メソッドを持つ抽象クラスを拡張しています。 my_databaseでは、このメソッドのすべてを実装する必要があります。 – arbogastes

0

あなたのクラスが抽象的であってはならない:OOPで

class my_database extends database { 
    public function set_value($value) { 
    $this->value = $value; 
    } 
} 

、抽象クラスは、それが拡張することができジュストインスタンス化することはできません。

+0

投稿を編集しました。 – klor

関連する問題