如果我有一个像这样的基本抽象类:
<?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')
.
我正在使用后期静态绑定,以便从扩展类中获取属性;但是由于User
并House
扩展了同一个父类,它们最终都具有相同的属性值,尽管它们用不同的值覆盖它。
Record
如果我要通过创建一个类Record2
并使用House
extend来复制该类Record2
,我就不会遇到这个问题——但这并没有真正的帮助。
这是错误的设置吗?我不应该在这种情况下使用静态变量吗?如果可以,我应该用什么代替它们?我知道这$table
不一定是静态的,但还有其他属性可能需要是静态的。