PHP中的对象包括其他对象

时间:2010-01-22 15:44:12

标签: php object

我认为标题是正确的但请纠正我,如果它是错误的领导。

问题:我有一个想要使用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对象的多个实例。至少我相信这是一个很好的做法^,^

6 个答案:

答案 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();