2

这是我的一般 php 页面:

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

includes.php一个名为 $db 的 pro 对象中启动,我想在指定的类中使用它cms.class.php

包括.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);

如何在我的类中使用此数据库对象,而无需在多个地方存储我的凭据?

4

2 回答 2

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

这种方法可以很好地扩展并且可以处理任何依赖。它还旨在将所有设置放在一个地方,这样您就不会到处乱扔配置设置。是唯一知道设置的$dm人,如果你需要根据设置构建一些东西,把它放在$dm.

于 2012-04-13T18:35:14.580 回答
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 变量传递给它,该变量可通过 ->db 访问,但只有一个实例。

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

全球的:

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

这种方式正在失去流行,因为全局变量通常不受欢迎,并且您必须在需要 $db 的每个函数中声明它。

还有其他与您的问题相关的好答案。 如何在简单的 php 函数中使用“依赖注入”,我应该打扰吗?

于 2012-04-13T18:38:39.380 回答