2 回答
TA贡献1869条经验 获得超4个赞
由于您的数据库客户端将被实例化一次,然后在其他地方使用,我最初的想法是建议将其作为构造函数参数传递(依赖注入),但由于您不喜欢这种方法,所以我建议将您的数据库客户端设置为单例类,这意味着它只能实例化一次,任何后续尝试都将在各处返回相同的实例。
作为一个简单的示例,您的数据库将类似于以下内容:
final class DB
{
public static function getInstance()
{
static $inst = null;
if ($inst === null) {
$inst = new self();
}
return $inst;
}
private function __construct()
{
// your code here ...
}
// your code here ...
}
然后,在您的 User 类上,您将获得 DB 类实例:
class User {
// your code here ...
public function doSomething() {
$db = DB::getInstance();
// your code here ...
}
}
TA贡献1827条经验 获得超4个赞
PHP 不像 Javascript 那样处理范围,你的 $db 是未定义的。
变量的作用域是定义它的上下文。大多数情况下,所有 PHP 变量都只有一个作用域。这个单一作用域也涵盖了包含的文件和必需的文件[…]在用户定义的函数中引入了本地函数作用域。默认情况下,函数内使用的任何变量都仅限于本地函数范围。
这意味着 PHP 中只有全局作用域和函数/方法作用域。因此,要么将 $db 实例作为协作者传递到方法中
class User{
public function __construct() {}
public function getInfo(Database $db) {
$db->query( /* ... */ );
}
}
$user = new User();
$db = new Database();
$user->getInfo($db);
或将其传递到构造函数中(依赖注入)
class User{
private $db;
public function __construct(Database $db)
{
$this->db = $db;
}
public function getInfo() {
$this->db->query( /* ... */);
}
}
$db = new Database();
$user = new User($db);
$user->getInfo();
- 2 回答
- 0 关注
- 113 浏览
添加回答
举报