有没有办法在PHP中定义抽象类属性?
abstract class Foo_Abstract {
    abstract public $tablename;
}
class Foo extends Foo_Abstract {
    //Foo must 'implement' $property
    public $tablename = 'users';   
}发布于 2011-10-03 20:32:50
没有定义属性这回事。
只能声明属性,因为它们是初始化时保留在内存中的数据的容器。
另一方面,函数可以声明(类型、名称、参数)而无需定义(缺少函数体),因此可以使其成为抽象的。
"Abstract“只表示声明了但没有定义的东西,因此在使用它之前,你需要定义它,否则它就变得无用了。
发布于 2011-10-03 20:38:59
不,没有办法强制使用编译器,您必须对$tablename变量使用运行时检查(例如,在构造函数中),例如:
class Foo_Abstract {
  public final function __construct(/*whatever*/) {
    if(!isset($this->tablename))
      throw new LogicException(get_class($this) . ' must have a $tablename');
  }
}要对抽象的所有派生类执行此操作,您必须将Foo_ 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;
  }
}发布于 2014-06-25 03:37:06
根据属性的上下文,如果我想在扩展类中强制声明抽象类属性,我喜欢在抽象对象构造函数或setter/getter方法中使用带有static关键字的常量作为属性。您可以选择使用final来防止该方法在扩展类中被重写。
abstract class AbstractFoo
{
    public $bar;
    final public function __construct()
    {
        $this->bar = static::BAR;
    }
}
class Foo extends AbstractFoo
{
    //const BAR = 'foobar'; //uncomment to prevent exception
}$foo = new Foo(); 
//Fatal Error: Undefined class constant 'BAR'但是,如果重新定义,扩展类将覆盖父类属性和方法。
例如,如果某个属性在父类中声明为protected,并在扩展类中重新定义为public,则生成的属性为public。否则,如果该属性在父类中声明为private,则它将保持为private,并且不可用于扩展类。
http://www.php.net//manual/en/language.oop5.static.php
https://stackoverflow.com/questions/7634970
复制相似问题