PHP:致命错误:无法实例化抽象类

klo*_*lor 9 php abstract-class instantiation

我有一个名为的抽象数据库类:

abstract class database {
  protected $value;
}
Run Code Online (Sandbox Code Playgroud)

我创建了另一个抽象类

abstract class my_database extends database {
  public function set_value($value) {
    $this->value = $value;
  }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用它时:

$my_db = new my_database();
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Fatal error: Cannot instantiate abstract class my_database in ...
Run Code Online (Sandbox Code Playgroud)

我尝试做的是:抽象类数据库有一个受保护的$值,我想创建一个包装类,以便能够(临时)更改受保护的值.

我怎样才能做到这一点?

EDIT1:不幸的是之前,当我尝试没有抽象my_database时,我得到了错误:

- abstract methods and must therefore be declared abstract or implemented
- Abstract function cannot contain body
Run Code Online (Sandbox Code Playgroud)

EDIT2:从my_database中完全取出抽象词后,我收到以下错误:

致命错误:类my_database包含32个抽象方法,因此必须声明为abstract或实现其余方法

我怎样才能解决这个问题?

arb*_*tes 13

定义为抽象的类可能无法实例化,并且包含至少一个抽象方法的任何类也必须是抽象的.您可以在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";
    }
}
Run Code Online (Sandbox Code Playgroud)

使用这样的类扩展抽象类(请注意,所有抽象方法必须在具体类中定义):

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

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以创建ConcreteClass1的实例:

$class1 = new ConcreteClass1;
Run Code Online (Sandbox Code Playgroud)


T. *_*OUT 5

你的类不应该是抽象的:

class my_database extends database {
  public function set_value($value) {
    $this->value = $value;
  }
}
Run Code Online (Sandbox Code Playgroud)

在OOP中,抽象类不能只被实例化而只能被扩展。