这是我的常规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 :(得分: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
。
答案 1 :(得分: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类时,您可以通过 - &gt; 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?