Файл PHP Require вне функции - PullRequest
       8

Файл PHP Require вне функции

3 голосов
/ 01 февраля 2012

Есть ли способ включить файл вне функции и заставить его работать?

т. У меня есть файл 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();
    }
}

Теперь мне нужен этот файл my в файле функций, 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 ]

1 голос
/ 01 февраля 2012

Действительно единственной альтернативой глобалам является использование объектно-ориентированных приемов и приемов.Например, если вы реализуете свою функциональность в виде набора классов, вы всегда можете получить доступ к любым статическим переменным общедоступных классов, поскольку они будут глобальными.Другой способ - использовать стандартный шаблон 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() );            
        }            
        ...            
    }
    ...
}
1 голос
/ 01 февраля 2012

После включения файла вне функции вы можете объявить переменную как глобальную, но это действительно плохой способ сделать что-то. Вместо этого у вас должен быть вызывающий функции проходной дескриптор в качестве аргумента. В противном случае вы можете создать фабрику для базы данных и вызывать ее в каждой функции.

Почему вы должны вызывать require вне функции?

0 голосов
/ 01 февраля 2012

Вы можете использовать оператор global:

require('db.inc.php')
function add() {
        global $DBH;
        $n = $DBH -> prepare("");
        $n -> execute((array)$s);
}
0 голосов
/ 01 февраля 2012

Вы просто хотите использовать ключевое слово global, чтобы ввести его в область действия функции:

function add() {
    global $DBH;
    $n = $DBH -> prepare("");
    $n -> execute((array)$s);
}

См. эту ссылку для получения дополнительной информации о переменной области.

Вы также можете использовать $ GLOBALS , но я не являюсь поклонником этого подхода.

В качестве альтернативы, вы можете передать дескриптор по ссылке при вызове add():

add($DBH);

function add(&$DBH) {
    global $DBH;
    $n = $DBH -> prepare("");
    $n -> execute((array)$s);
}
...