【问题标题】:use an object previously declared in an other class使用之前在其他类中声明的对象
【发布时间】:2012-04-26 03:06:19
【问题描述】:

这是我的一般 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);

如何在我的课程中使用此数据库对象,而无需在多个位置存储我的凭据?

【问题讨论】:

  • 通过cms类构造函数在你的类中注入$db对象,或者有你传递的注册对象。
  • 是完整的 includes.php 吗?我的理解是任何“在线”都会被执行。因此,$db 应该是可访问的。

标签: php pdo


【解决方案1】:

需要 想要依赖管理器或引导程序或任何您想调用的名称。

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 中。

【讨论】:

  • 这听起来是个不错的解决方案;与新类构造中 $db 对象的“简单”注入相比,还有很多代码。你还能在 $dm 中添加什么?只是为了让扩展代码“值得”这个地方?是添加一个好的日志功能的好地方吗?您有一些可以添加到 dm 中的示例吗?
  • 任何类似于资源的东西。一个数据库(显然)。记录器(他们通常有设置,写入 this 文件或邮寄到 that 地址)。会话管理器等。如果您只需要构造一个对象并传入一个数据库,这将是很多代码,但如果您的应用程序更复杂,它会很快得到回报。基本上你想要“运行”的唯一文件就是这个引导文件,所有其他文件都应该是类。
【解决方案2】:

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

第一种方式,注射,越来越受欢迎。注入意味着您将为您的班级提供 $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 的每个函数中声明它。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多