PHP 抽象属性

2022-08-30 06:50:25

有没有办法在PHP中定义抽象类属性?

abstract class Foo_Abstract {
    abstract public $tablename;
}

class Foo extends Foo_Abstract {
    //Foo must 'implement' $property
    public $tablename = 'users';   
}

答案 1

没有定义属性这样的事情。

只能声明属性,因为它们是初始化时保留在内存中的数据的容器。

另一方面,函数可以在不定义(缺少函数体)的情况下声明(类型,名称,参数),因此可以抽象。

“抽象”仅表示某些内容已声明但未定义,因此在使用它之前,您需要定义它,否则它将变得无用。


答案 2

不,没有办法使用编译器强制执行,您必须对变量使用运行时检查(例如,在构造函数中),例如:$tablename

class Foo_Abstract {
  public final function __construct(/*whatever*/) {
    if(!isset($this->tablename))
      throw new LogicException(get_class($this) . ' must have a $tablename');
  }
}

要对所有派生类Foo_Abstract强制执行此命令,您必须Foo_Abstract构造函数,以防止重写。final

你可以声明一个抽象的 getter 来代替:

abstract class Foo_Abstract {
  abstract public function get_tablename();
}

class Foo extends Foo_Abstract {
  protected $tablename = 'tablename';
  public function get_tablename() {
    return $this->tablename;
  }
}

推荐