首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP抽象属性

PHP抽象属性
EN

Stack Overflow用户
提问于 2011-10-03 20:28:43
回答 6查看 90.6K关注 0票数 138

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

代码语言:javascript
复制
abstract class Foo_Abstract {
    abstract public $tablename;
}

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

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-10-03 20:32:50

没有定义属性这回事。

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

另一方面,函数可以声明(类型、名称、参数)而无需定义(缺少函数体),因此可以使其成为抽象的。

"Abstract“只表示声明了但没有定义的东西,因此在使用它之前,你需要定义它,否则它就变得无用了。

票数 160
EN

Stack Overflow用户

发布于 2011-10-03 20:38:59

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
abstract class Foo_Abstract {
  abstract public function get_tablename();
}

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

Stack Overflow用户

发布于 2014-06-25 03:37:06

根据属性的上下文,如果我想在扩展类中强制声明抽象类属性,我喜欢在抽象对象构造函数或setter/getter方法中使用带有static关键字的常量作为属性。您可以选择使用final来防止该方法在扩展类中被重写。

示例:https://3v4l.org/WH5Xl

代码语言:javascript
复制
abstract class AbstractFoo
{
    public $bar;

    final public function __construct()
    {
        $this->bar = static::BAR;
    }
}

class Foo extends AbstractFoo
{
    //const BAR = 'foobar'; //uncomment to prevent exception
}
代码语言:javascript
复制
$foo = new Foo(); 
//Fatal Error: Undefined class constant 'BAR'

但是,如果重新定义,扩展类将覆盖父类属性和方法。

例如,如果某个属性在父类中声明为protected,并在扩展类中重新定义为public,则生成的属性为public。否则,如果该属性在父类中声明为private,则它将保持为private,并且不可用于扩展类。

http://www.php.net//manual/en/language.oop5.static.php

票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7634970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档