【发布时间】:2017-10-25 11:32:55
【问题描述】:
我有一个主课
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 值的新实例,因为它在父级中是空的类。
任何想法如何使这项工作?
【问题讨论】:
-
php.net/manual/en/language.oop5.static.php 仅使用(在您的情况下滥用)
$self不会使fetch成为静态。 -
“用户”不是特殊类型的“数据库”。此外,通过制作 SQL 包装器,实际上会使代码的安全性降低。此外,应避免使用静态代码,因为它会导致引入紧密耦合。你可能应该查一下data mapper 是什么......你知道,不要让大学难堪。
-
用户不是数据库。
-
虽然他的班级组织可能是错误的,但班级实际上被称为
Users,而不是用户;所以它至少代表用户的集合,而不是特定的用户实例。无论如何,这不是重点;因为它可以代表 OP 想要的任何东西,所以这是一个意见和辩论的问题;关于类命名和资源命名几乎没有一个学派。 -
@yivi 让事情变得更糟。
标签: php oop late-static-binding