如果我有一个抽象基类,像这样:PHP - 扩展静态属性/子类
<?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
不一定必须是静态的,但还有其他属性可能需要是静态的。
'父::'?也许你应该试试 –
我不知道我是否和你在一起'打破用户课堂' - 你能解释一下你的问题吗? –
它可以使用'self ::'而不是'static ::'吗? –