PHP要求文件在函数之外

时间:2012-02-01 16:18:05

标签: php function require

有没有办法在函数外部包含一个文件并使其有效?

即。我有一个文件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个函数,所以只需要在函数外部使用它并使函数工作吗?

感谢和问候

4 个答案:

答案 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);
}