次の名前の抽象データベースクラスがあります。
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個の抽象メソッドが含まれているため、抽象として宣言するか、残りのメソッドを実装する必要があります
どうすれば修正できますか?
抽象として定義されたクラスはインスタンス化できません。また、少なくとも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;
あなたのクラスは抽象的であってはなりません:
class my_database extends database {
public function set_value($value) {
$this->value = $value;
}
}
OOPでは、抽象クラスをインスタンス化することはできませんが、拡張できます。