我认为标题是正确的但请纠正我,如果它是错误的领导。
问题:我有一个想要使用DB类的类,而不是必须使用“global $ db;”在我希望使用的每个方法中,我希望能够将对象引用放在我的类属性中。
还在关注?好的,这里是:
class user
{
private $id = 0;
private $name = NULL;
private $password = NULL;
private $db;
function __construct()
{
$this->load_db();
}
private function load_db()
{
global $db;
$this->$db =& $db;
}
我收到错误“类db的对象无法转换为字符串”这很烦人,因为我无法弄清楚如何在PHP中设置var类型...
现在我的问题有两个:
1)我该如何解决这个问题。 要么 2)有没有更好的方法来做到这一点,因为这感觉真的很“笨拙”。
提前致谢,
Dorjan
编辑:只是为了确保我清楚我不想创建同一个DB对象的多个实例。至少我相信这是一个很好的做法^,^
答案 0 :(得分:2)
如果您使用$ this,则只需要一个美元符号。所以$this->db
。
答案 1 :(得分:2)
private function load_db()
{
global $db;
$this->db =& $db;
}
此外,如果您使用的是PHP 5,则不需要使用=&
运算符,因为对象是通过引用隐式传递的。其次,您应该将$db
注入构造函数或从Registry对象中获取它而不是使用global
。
答案 2 :(得分:2)
你应该做得更好
class User
{
private $id = 0;
private $name = NULL;
private $password = NULL;
private $db;
function __construct($db=null)
{
$this->db = $db;
}
}
请注意,如果您通过$
访问属性,则不会在变量名称前添加$object->
。那就是错误来自。
在类方法中使用全局是非常糟糕的做法,因为你以某种方式将类绑定到该全局变量。最好将它作为参数传递给构造函数或方法。
稍后您可以使用
实例化该类$user = new User($db)
另请注意,按惯例的类名以大写字母开头。
答案 3 :(得分:1)
此:
$this->db
答案 4 :(得分:1)
通过构造函数
注入数据库实例public function __construct($db)
{
$this->db = $db;
}
答案 5 :(得分:1)
Yopu想要使用名为dependency injection的东西。这是您将对象“注入”另一个对象以执行对象所做的任何操作的位置。在这种情况下做数据库的东西
类用户 { private $ id = 0; private $ name = NULL; private $ password = NULL; 私人$ db;
function __construct($database_object)
{
$this->load_db();
$this->$db = $database_object;
}
public function do_db_stuff()
{
$this->$db->doStuff();
}
$db = new Mysql()
$user = new User($db);
$user->do_db_stuff();