有没有办法在函数外部包含一个文件并使其有效?
即。我有一个文件db.inc.php,它包含我的数据库连接字符串:
switch (DB_TYPE) {
case MYSQL :
try {
$DBH = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . "", DB_USER, DB_PASS);
$DBH -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
echo "Error in Connection" . $e -> getMessage();
}
}
现在我在我的函数文件functions.php中需要这个文件:
require('db.inc.php')
function add() {
$n = $DBH -> prepare("");
$n -> execute((array)$s);
}
所以文件正确添加,但我的函数无法访问$ DBH句柄。只有当我在我的函数中包含文件时:
function add(){
require('db.inc.php')
....etc....
}
我的功能是否有效。
因为我要在许多文件中至少有4-5个函数,所以只需要在函数外部使用它并使函数工作吗?
感谢和问候
答案 0 :(得分:1)
在函数外部包含文件后,您可以将变量声明为全局变量,但这确实是一种糟糕的做事方式。相反,您应该将函数传递句柄的调用者作为参数。如果做不到这一点,你可以为数据库创建一个工厂并在每个函数中调用它。
为什么你必须在函数外面调用require
?
答案 1 :(得分:1)
真的是全局变量的唯一替代方法是使用面向对象的技巧和技巧。例如,如果您将功能实现为一组类,那么您始终可以访问任何静态公共类变量,因为它们将是全局的。另一种方法是为单个对象类使用标准PHP模式。这与您的情况特别相关,因为您似乎正在包装标准PDO类。在我的情况下,我使用mysqli,但同样的技术适用。任何模块都可以使用AppDB::get()
访问数据库对象。这是我的模块的序言给你的想法(我已经修剪了doxygen文档以保持简短):
class AppDB extends mysqli {
/**
* This class uses a standard single class object pattern.
*/
private static $_instance;
private static $_class = __CLASS__;
private function __clone() {}
/**
* Initialise the blog context. This is a static method since only one AppDB instance is allowed. The
* $connectParams must be provided on first invocation.
*/
public static function get() {
if ( !isset( self::$_instance) ) self::$_instance = new self::$_class ();
return self::$_instance;
}
/**
* AppDB constructor. Connect to the database and initialise the list of tables with the given prefix.
*/
private function __construct() {
parent::init();
list( $host, $db, $user, $passwd, $this->tablePrefix ) = explode ( ':', SQL_CONTEXT );
if( !parent::real_connect($host, $user, $passwd, $db)) {
throw new Exception ('Connect Error (' .
mysqli_connect_errno() . ') ' . mysqli_connect_error() );
}
...
}
...
}
答案 2 :(得分:0)
您只想使用global关键字将其置于函数的范围内:
function add() {
global $DBH;
$n = $DBH -> prepare("");
$n -> execute((array)$s);
}
有关变量范围的更多信息,请参阅this link。
您也可以使用$GLOBALS,但我不喜欢这种做法。
或者,当您致电add()
时,您可以通过引用传递句柄:
add($DBH);
function add(&$DBH) {
global $DBH;
$n = $DBH -> prepare("");
$n -> execute((array)$s);
}
答案 3 :(得分:0)
您可以使用global
运算符:
require('db.inc.php')
function add() {
global $DBH;
$n = $DBH -> prepare("");
$n -> execute((array)$s);
}