有没有办法在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
,并且不可用于扩展类。
https://stackoverflow.com/questions/7634970
复制相似问题