2011-11-04 82 views
2

是否可以在对象中使用对象?例如,我有一个MySQL类,它具有与MySQL相关的所有方法(连接,查询,获取行...),并创建一个名为User的新对象,该对象将具有诸如登录,注销,注册等方法。 ..是否有可能包括我的MySQL类,定义一个对象,然后在我的新对象中运行查询?如果是这样,如何? 例如:在对象中使用对象?

class User{ 
    $m = new MySQL(); 
    function login($username, $password, $remember = false){ 
       $m->rQuery("SELECT * FROM users......"); 
    } 
} 
+1

临提示:*将您的数据库对象传递给用户,而不是让用户自己实例化它。它减少*耦合。*检查[依赖注入](http://en.wikipedia.org/wiki/Dependency_injection) – webbiedave

回答

2

是的,你可以使用它像这样的任何子对象:

class User{ 
    private $db; 

    function __construct() 
    { 
     $this->db = new MySQL(); 
    } 

    function login($username, $password, $remember = false){ 
       $this->db->rQuery("SELECT * FROM users......"); 
    } 
} 
3

是否有可能在对象上使用一个对象?

是的。

使用__construct函数初始化,你需要

0

Ofcource,你可以,但不是这样的。你可以做的就是这样:

class User 
{ 
    private $m = null; 

    function __construct() 
    { 
     $this->m = new MySQL(); 
    } 

    function login($username, $password, $rememer = false) 
    { 
     $this->m->rQuery("SELECT * FROM users......"); 
    } 
} 
+0

旧式构造函数。我赞成'__construct'。 – GolezTrol

+0

您降级的时间我更改了构造函数名称。如果您喜欢,请再次提高 –

+0

感谢您的提升。 –

2

的答案是非常相似的人,但有一个 - 在我看来,关键的 - 区别:不是实例的依赖/依赖于构造通过他们构造:

class User 
{ 
    protected $db; 

    public function __construct(Db $db) 
    { 
     $this->db = $db; 
    } 

    public function login($username, $password) 
    { 
     $this->db->query("SELECT * FROM users..."); 
    } 
} 

这种类型的dependency injection的好处包括:

  1. 它清楚地表明客户/消费者类(User)具有依赖关系(Db)。
  2. 减少User类和Db类之间的耦合。这对unit-testingUser类有显着帮助。您可以创建一个按预期执行的模拟Db。任何测试失败都明确归因于User类。

当然,为了实例化User对象,您需要首先实例化一个Db对象。由于单个对象或长链依赖关系存在很多依赖关系,这可能是一种痛苦。在这种情况下,使用工厂或依赖注入容器来协助创建对象是有帮助的,但不是必需的。