代码之家  ›  专栏  ›  技术社区  ›  Dorjan

php中的对象,包括其他对象

  •  0
  • Dorjan  · 技术社区  · 15 年前

    我认为标题是对的,但如果标题错了,请纠正我。

    问题是:我有一个类想要使用db类,现在不需要“global$db”;在我希望使用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;
        }
    

    我得到一个错误“object of class db could not be converted to string”,这很烦人,因为我不知道如何在php中设置var类型…

    现在我的问题有两个方面:

    1)如何修复此问题。 或 2)有没有更好的方法可以做到这一点,因为这真的感觉“卡克手”。

    事先谢谢,

    多伦

    编辑:为了确保清楚,我不想创建同一个DB对象的多个实例。至少我相信这是一个很好的实践^,,^

    6 回复  |  直到 15 年前
        1
  •  2
  •   Skilldrick    15 年前

    如果你用这个,你只需要一个美元符号。所以 $this->db .

        2
  •  2
  •   prodigitalson    15 年前
    private function load_db()
    {
            global $db;
            $this->db =& $db;
    }
    

    另外,如果您使用的是php 5,则不需要使用 =& 运算符,因为对象是通过引用隐式传递的。第二,你应该注射 $db 或者从注册表对象中获取它,而不是使用 global .

        3
  •  2
  •   Felix Kling    15 年前

    你最好这样做

    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)
    

    还要注意,按照约定,类名以大写字母开头。

        4
  •  1
  •   Ignacio Vazquez-Abrams    15 年前

    这是:

    $this->db
    
        5
  •  1
  •   Gordon Haim Evgi    15 年前

    通过构造函数注入DB实例

    public function __construct($db)
    {
        $this->db = $db;
    }
    
        6
  •  1
  •   John Conde    15 年前

    尤普想用一种叫 dependency injection . 在这里,您可以将一个对象“注入”到另一个对象中,以执行该对象执行的任何操作。在这种情况下,做数据库工作

    类用户 { private$id=0; private$name=空; private$password=空; 私人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();