Php 使用以前在其他类中声明的对象
这是我的通用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
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中添加什么吗?任何类似于资源的东西。数据库(显然)。日志记录者(他们通常有设置、写入此文件或发送邮件到该地址)。会话管理器等。如果您只需要构造一个对象并传入数据库,则需要编写大量代码,但如果您的应用程序更复杂,则会很快得到回报。基本上,您想要“运行”的唯一文件就是这个引导文件,所有其他文件都应该是类。