1

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

<?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';冒泡到父类,所以 now Record::$table = 'houses';。由于House在 之后声明User,下次我在$user->getRows()内部调用时,会User引用 parentRecord并最终调用getRowsFromTable('houses')而不是getRowsFromTable('users').

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

Record如果我要通过创建一个类Record2并使用Houseextend来复制该类Record2,我就不会遇到这个问题——但这并没有真正的帮助。

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

4

1 回答 1

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';
    }
}
于 2013-10-04T00:50:10.700 回答