web-dev-qa-db-ja.com

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 ...

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

どうやってやるの?

EDIT1:残念ながら、抽象my_databaseなしで試したときに、エラーが発生しました:

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

EDIT2:my_databaseから抽象Wordを完全に取り出した後、次のエラーが表示されました。

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

どうすれば修正できますか?

9
klor

抽象として定義されたクラスはインスタンス化できません。また、少なくとも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;
13
arbogastes

あなたのクラスは抽象的であってはなりません:

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

OOPでは、抽象クラスをインスタンス化することはできませんが、拡張できます。

3
T. AKROUT