2012-04-13 73 views
2

这是我一般的PHP页面:使用以前在其他类中声明的对象

<?php 
require_once('includes.php'); 
require_once('cms.class.php'); 
..... 
rest of the page 
?> 
includes.php

的亲对象调用$ DB开始,我想在cms.class.php

指定的类使用

includes.php:

$db = new PDO('mysql:host=localhost;dbname=xxxxx','xxxxx','xxxxxx'); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 

我如何使用我的班这个数据库对象,而不必多个地方,我的凭据存储?

+0

通过cms类构造函数在您的类中注入'$ db'对象,或者创建一个您传递的注册表对象。 – 2012-04-13 18:23:05

+0

这是完整的includes.php吗?我的理解是,任何“内联”都将被执行。因此,$ db应该是可访问的。 – kevingreen 2012-04-13 18:23:17

回答

3

需要无论你怎么称呼它依赖经理或引导程序或。

class Dependency_Manager { 

    private $db; 

    public function __construct($settings) { 
     $this->db = new PDO('mysql:host=localhost;dbname=' . settings["dbname"],settings["username"],$setings["password"]); 
     $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
    } 

    public function getDB() { 
     return $db; 
    } 

} 

class CMS { 
    public function __construct(PDO $db) { 
     /* .. */ 
    } 
} 

$setting = array(/* etc */); 

$dm = new Dependency_Manager($settings); 
$cms = new CMS($dm->getDB()); 

此方法能非常好,可以处理任何dependecy。它还旨在将所有设置放在一个位置,这样您就不会在任何地方散布配置设置。 $dm是唯一知道这些设置的人,如果您需要根据设置构建某些内容,请将其置于$dm中。

+0

这听起来很不错,但与新类构造中的$ db对象的'简单'注入相比,还有很多代码。还有什么可以添加到$ DM?只是为了使扩展代码“值得”的地方?这是一个添加良好记录功能的好地方吗?你有什么样的例子可以添加到dm中吗? – stUrb 2012-04-13 18:58:04

+1

任何就像_resource_。一个数据库(显然)。记录器(他们通常有设置,写入_this_文件或邮件到_that_地址)。会话管理器等。如果您只需要构建一个对象并传入数据库,那么它就是很多代码,但如果您的应用程序更复杂,它将很快得到回报。基本上你想运行的唯一文件是这个引导文件,所有其他文件应该是类。 – Halcyon 2012-04-13 19:01:05

1

有两种方法可以解决这个问题。

注射的第一种方式越来越受欢迎。注射意味着你会为你的班级提供$ db。你可以做这样的事情。

注:

class CMS_class { 
    protected static $db; 

    public function __construct($db) { 
    if (! isset(self::$db)) 
     self::$db = $db; 
    } 

    public function __get($name) { 
    if ($name === 'db') 
     return self::$db; 
    } 
} 

现在,当你构建CMS类传递给它的$ DB变量,它是通过访问 - >分贝,但只有一个实例。

第二种方法是在您使用它的每个函数中全局调用它。

全球:

class CMS_class { 
    function hello_world() { 
    global $db; 
    var_dump($db); 
    } 
} 

这种方式正在失去流行,因为全局通常是令人难以接受的,你将不得不宣布它在每一个你需要$ DB函数。

还有其他与你的问题有关的好答案。 How can I use "Dependency Injection" in simple php functions, and should I bother?