如果我有这样的基本抽象类:
<?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
扩展了相同的父类,它们最终都会使用相同的属性值,尽管它们会用不同的值覆盖它。
如果我通过创建课程Record
并Record2
延长House
来复制Record2
课程,我就不会遇到这个问题 - 但这不会真的很有帮助。
这是错误的设置吗?我不应该在这种情况下使用静态变量吗?如果是这样的话,我应该把它们放在哪里呢?我知道$table
不一定是静态的,但还有其他属性可能需要是静态的。
答案 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';
}
}