【问题标题】:PHP - Static property in extended/child classPHP - 扩展/子类中的静态属性
【发布时间】:2013-10-10 20:32:20
【问题描述】:

如果我有一个像这样的基本抽象类:

<?php
abstract class Record {
    static $table;

    public function getRows () {
        return getRowsFromTable(static::$table);
    }
}
?>

我想像这样扩展这个类:

<?php
class User extends Record {
    static $table = 'users';

    private $name;
?>

如果我打电话:

<?php
$user = new User;
$user->getRows();
?>

在内部,getRows() 调用并返回getRowsFromTable('users')

但如果我要创建另一个也扩展 Record 的类:

<?php
class House extends Record {
    static $table = 'houses';

    private $address;
?>

然后,static $table = 'houses'; 声明会覆盖 Record::$table,因此会破坏 User 类。

发生的事情是,声明 static $table = 'houses'; 冒泡到父类,所以现在是 Record::$table = 'houses';。由于House 是在User 之后声明的,所以下次我在内部调用$user-&gt;getRows() 时,User 引用父级Record 并最终调用getRowsFromTable('houses') 而不是getRowsFromTable('users')

我正在使用后期静态绑定,以便从扩展类中获取属性;但是由于UserHouse 扩展了同一个父类,它们最终都得到了相同的属性值,尽管它们用不同的值覆盖了它。

如果我通过创建一个类Record2 并让House 扩展Record2 来复制Record 类,我就不会遇到这个问题——但这并没有真正的帮助。

这是错误的设置吗?我不应该在这种情况下使用静态变量吗?如果可以,我应该用什么代替它们?我知道$table 不一定必须是静态的,但还有其他属性可能需要是静态的。

【问题讨论】:

  • parent::?也许你应该尝试一下
  • 我不确定我是否和你一起讨论“破坏用户类” - 你能进一步解释你的问题吗?
  • 它是否适用于self:: 而不是static::
  • parentself 都不起作用,parent 会触发错误(因为在 Record 类范围内没有父级),self 将始终返回 @987654356 @(因为它将访问 Record 类范围内的 $table)。他的示例代码需要late static binding,所以他必须使用static。 @jon_darkstar @GeorgeMarques
  • @ndm - 我完全同意你的观点:Record 上方没有 parent,并且无论任何子类做什么,self 都将保持永远为空。这一切都没有解释,我仍然想念的是 OP 不满意的原因。 @M Miller:这一切与您的预期/期望行为有何不同?您认为打破User 类的原因是什么?

标签: php inheritance static extends


【解决方案1】:

我真的不会为此使用静态字符串。

这样的事情怎么样...

abstract class Record {
    /**
     * @return table name as string
     */
    abstract protected function getTable();

    public function getRows () {
        return getRowsFromTable($this->getTable());
    }
}

那么,你的具体实现必须实现getTable,例如

class User extends Record {
    protected function getTable() {
        return 'users';
    }
}

【讨论】:

    猜你喜欢
    • 2011-05-27
    • 1970-01-01
    • 2010-11-19
    • 2012-12-20
    • 2016-01-23
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多