【发布时间】: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->getRows() 时,User 引用父级Record 并最终调用getRowsFromTable('houses') 而不是getRowsFromTable('users')。
我正在使用后期静态绑定,以便从扩展类中获取属性;但是由于User 和House 扩展了同一个父类,它们最终都得到了相同的属性值,尽管它们用不同的值覆盖了它。
如果我通过创建一个类Record2 并让House 扩展Record2 来复制Record 类,我就不会遇到这个问题——但这并没有真正的帮助。
这是错误的设置吗?我不应该在这种情况下使用静态变量吗?如果可以,我应该用什么代替它们?我知道$table 不一定必须是静态的,但还有其他属性可能需要是静态的。
【问题讨论】:
-
parent::?也许你应该尝试一下 -
我不确定我是否和你一起讨论“破坏用户类” - 你能进一步解释你的问题吗?
-
它是否适用于
self::而不是static::? -
parent和self都不起作用,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