PHP - 扩展/子类中的静态属性

时间:2013-10-04 00:08:40

标签: php inheritance static extends

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

<?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->getRows()时,User会引用父Record并最终调用getRowsFromTable('houses')而不是getRowsFromTable('users')

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

如果我通过创建课程RecordRecord2延长House来复制Record2课程,我就不会遇到这个问题 - 但这不会真的很有帮助。

这是错误的设置吗?我不应该在这种情况下使用静态变量吗?如果是这样的话,我应该把它们放在哪里呢?我知道$table不一定是静态的,但还有其他属性可能需要是静态的。

1 个答案:

答案 0 :(得分:0)

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

这样的事情怎么样......

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';
    }
}