我有一个主要课程
abstract class Database
{
protected $table;
public function where(array $params)
{
// ...
}
public function get()
{
// ...
}
}
然后我使用该类的扩展版本:
Users extends Database
{
protected $table = 'users';
}
现在,每当我需要选择用户时,我只需使用:
$db = new Users();
$results = $db->where(['id' => 1])->get();
这样可以正常工作,但我认为专门针对id的请求创建一个静态快捷方式会很好,但是我在统计初始化类时遇到了问题。
我创建了一个方法fetch
,它应该设置Id并使用找到的对象进行返回。
class Database // Had to drop abstract, since self cant be used
{
protected $table;
public static function fetch(int $id)
{
$self = new self;
$result = $self->where(['id' => $id])->get();
return $result;
}
}
但是,正如我评论的那样,self
不能用于抽象,所以我不得不放弃它和它创建一个没有table
值的新实例,因为它是在父类中为空。
任何想法如何使这项工作?
答案 0 :(得分:1)
您正试图在运行时解决该课程。 self
无法帮助您。您需要使用static
。请继续阅读late static bindings。
class Database // Had to drop abstract, since self cant be used
{
protected $table;
public static function fetch(int $id)
{
$self = new static;
$result = $self->where(['id' => $id])->get();
return $result;
}
}
由于您使用self
,因此在运行时您将获得原始基类(实际使用self
的类)。通过使用static
,您将获得实际运行代码的类。
答案 1 :(得分:1)
在方法中使用static
代替self
:
public static function fetch(int $id)
{
$self = new static;
$result = $self->where(['id' => $id])->get();
return $result;
}
通过这种方式,您将获得扩展类的实例(例如Users
),但不会获取声明方法的实例(即Database
)。