Php 使用以前在其他类中声明的对象

Php 使用以前在其他类中声明的对象,php,pdo,Php,Pdo,这是我的通用php页面: <?php require_once('includes.php'); require_once('cms.class.php'); ..... rest of the page ?> 如何在我的类中使用此数据库对象,而不在多个位置存储我的凭据?您需要一个依赖项管理器或引导程序,或者任何您想称之为它的东西 class Dependency_Manager { private $db; public function __construc

这是我的通用php页面:

<?php
require_once('includes.php');
require_once('cms.class.php');
.....
rest of the page
?>
如何在我的类中使用此数据库对象,而不在多个位置存储我的凭据?

您需要一个依赖项管理器或引导程序,或者任何您想称之为它的东西

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

您需要依赖项管理器或引导程序或任何您想要调用的工具

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。你可以这样做

注射:

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);
  }
}
这种方法越来越不受欢迎,因为globals通常不受欢迎,并且您必须在每个需要$db的函数中声明它

还有其他与你的问题相关的好答案。
有两种方法可以解决这个问题

第一种方法,注射,越来越受欢迎。注入意味着您将向类提供$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);
  }
}
这种方法越来越不受欢迎,因为globals通常不受欢迎,并且您必须在每个需要$db的函数中声明它

还有其他与你的问题相关的好答案。

通过cms类构造函数在类中注入
$db
对象,或者传递一个注册表对象。这是完整的includes.php吗?我的理解是,任何“在线”的东西都会被执行。因此,$db应该是可访问的。通过cms类构造函数在类中注入
$db
对象,或者传递一个注册表对象。这是完整的includes.php吗?我的理解是,任何“在线”的东西都会被执行。因此,$db应该是可访问的;但与新类构造中$db对象的“简单”注入相比,还有很多代码。您还可以在$dm中添加哪些内容?只是为了让扩展代码“值得”使用?这是一个添加良好日志功能的好地方吗?你有一些例子可以在dm中添加什么吗?任何类似于资源的东西。数据库(显然)。日志记录者(他们通常有设置、写入此文件或发送邮件到该地址)。会话管理器等。如果您只需要构造一个对象并传入数据库,则需要编写大量代码,但如果您的应用程序更复杂,则会很快得到回报。基本上,你想“运行”的唯一文件就是这个引导文件,所有其他文件都应该是类;但与新类构造中$db对象的“简单”注入相比,还有很多代码。您还可以在$dm中添加哪些内容?只是为了让扩展代码“值得”使用?这是一个添加良好日志功能的好地方吗?你有一些例子可以在dm中添加什么吗?任何类似于资源的东西。数据库(显然)。日志记录者(他们通常有设置、写入此文件或发送邮件到该地址)。会话管理器等。如果您只需要构造一个对象并传入数据库,则需要编写大量代码,但如果您的应用程序更复杂,则会很快得到回报。基本上,您想要“运行”的唯一文件就是这个引导文件,所有其他文件都应该是类。