在php中,我们需要在所有文件中包含,还是有更好的方法?

在php中,我们需要在所有文件中包含,还是有更好的方法?,php,mysql,database,pdo,connection,Php,Mysql,Database,Pdo,Connection,我在根文件夹中有一个DB配置(DB.php) 使用PDO_-MySQL的MySQL $host = ""; $user = ""; $pass = ""; $dbname = ""; # connect to the database $DBH = new PDO("mysql:host=$host;port=3306;dbname=$dbname", $user, $pass,array(PDO::ATTR_PERSISTENT => true)); $DBH->setAttrib

我在根文件夹中有一个DB配置(DB.php)

使用PDO_-MySQL的MySQL

$host = "";
$user = "";
$pass = "";
$dbname = "";
# connect to the database
$DBH = new PDO("mysql:host=$host;port=3306;dbname=$dbname", $user, $pass,array(PDO::ATTR_PERSISTENT => true));
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
我想,如果我需要一个数据库连接,我需要这样做

<?php
include '../../db.php';

简短的回答:,您需要在每个使用DB文件的页面中包含它

答案很长。。。PHP不会在每次运行脚本时都加载存在的所有PHP文件,因此它必须知道变量/类的来源。但是,有两种方法不必每次都包含db文件。您的选项是,您可以自动预加文件,您可以从已经设置了db变量的另一个文件中包含您的文件,或者您可以以OO方式设置代码并包含自动加载文件

自动前置

如果此服务器上的每个文件都需要访问数据库,并且您可以访问php.ini文件,则可以在php.ini中设置该选项。这将自动将文件包含在每个文件中,就像由
require
加载一样。如果您选择此路径,请确保您正在签入已加载的db文件:

your-db-file.php

if (!defined('MYPROJECT_DB_FILE_LOADED')) {
    define('MYPROJECT_DB_FILE_LOADED', true);
    // load DBH and stuff here.
}
从另一个文件中包含

另一个不需要处理php.ini文件的好方法是以从父文件加载php文件的方式构造代码。WordPress如何处理页面加载就是一个很好的例子。WordPress有一个主index.php文件,用于检查URL并根据路径加载页面。此文件中包含的页面可以访问该文件中的变量。如何设置的一个简单示例如下:

// Do all of your DBH stuff
$DBH = ...

$url = trim($_SERVER['REQUEST_URI'], '/');
if ($url === 'some/path/here') {
    include 'other-file.php';
}
.htaccess在根目录中(假设启用了mod_rewrite)

这将通过您的index.php文件路由所有内容,该文件可能包含以下内容:

// Do all of your DBH stuff
$DBH = ...

$url = trim($_SERVER['REQUEST_URI'], '/');
if ($url === 'some/path/here') {
    include 'other-file.php';
}
然后,other file.php可以访问DBH变量:

$DBH->do_something();
使用OO(面向对象)设计并包括自动加载

最常见的方法(imho是最好的)是以面向对象的方式构造代码,只包含自动加载文件。一个很好的例子是composer如何将依赖项安装到项目中,并生成要包含的文件

一种简单的方法是为类命名名称空间,将它们全部放在一个目录中,然后创建一个自动加载文件(使用)。下面是一个快速(未经测试)的示例,说明如何实现这一点:

Inside/projectroot/lib,例如:

/projectroot/lib/MyDB.php

namespace MyProject;

if (!class_exists('\MyProject\MyDB')) {
    class MyDB {
        // Add some DB methods in here.
    }
}
/projectroot/lib/autoload.php

if (!defined('MYPROJECT_SPL_AUTOLOAD_REGISTERED')) {
    define('MYPROJECT_SPL_AUTOLOAD_REGISTERED', true);
    spl_autoload_register(function($class) {
        $class = explode($class, '\\');
        if (array_shift($class) === 'MyProject') {
            require __DIR__.'/'.join('/', $class);
        }
    });
}
然后,从您拥有的任何其他文件:

require '/projectroot/lib/autoload.php';

$db = new \MyProject\MyDB();

我意识到,最后一个选项并不能阻止您在每个文件中使用include,但您总是包含同一个文件(这样您就可以复制/粘贴),并且在您的lib文件夹中正确命名的任何类都将在您需要时自动包含,因此,它将不仅仅适用于您的数据库内容。

简单回答:,您需要在使用它的每个页面中包含您的数据库文件

答案很长。。。PHP不会在每次运行脚本时都加载存在的所有PHP文件,因此它必须知道变量/类的来源。但是,有两种方法不必每次都包含db文件。您的选项是,您可以自动预加文件,您可以从已经设置了db变量的另一个文件中包含您的文件,或者您可以以OO方式设置代码并包含自动加载文件

自动前置

如果此服务器上的每个文件都需要访问数据库,并且您可以访问php.ini文件,则可以在php.ini中设置该选项。这将自动将文件包含在每个
文件中,就像由
require
加载一样。如果您选择此路径,请确保您正在签入已加载的db文件:

your-db-file.php

if (!defined('MYPROJECT_DB_FILE_LOADED')) {
    define('MYPROJECT_DB_FILE_LOADED', true);
    // load DBH and stuff here.
}
从另一个文件中包含

另一个不需要处理php.ini文件的好方法是以从父文件加载php文件的方式构造代码。WordPress如何处理页面加载就是一个很好的例子。WordPress有一个主index.php文件,用于检查URL并根据路径加载页面。此文件中包含的页面可以访问该文件中的变量。如何设置的一个简单示例如下:

// Do all of your DBH stuff
$DBH = ...

$url = trim($_SERVER['REQUEST_URI'], '/');
if ($url === 'some/path/here') {
    include 'other-file.php';
}
.htaccess在根目录中(假设启用了mod_rewrite)

这将通过您的index.php文件路由所有内容,该文件可能包含以下内容:

// Do all of your DBH stuff
$DBH = ...

$url = trim($_SERVER['REQUEST_URI'], '/');
if ($url === 'some/path/here') {
    include 'other-file.php';
}
然后,other file.php可以访问DBH变量:

$DBH->do_something();
使用OO(面向对象)设计并包括自动加载

最常见的方法(imho是最好的)是以面向对象的方式构造代码,只包含自动加载文件。一个很好的例子是composer如何将依赖项安装到项目中,并生成要包含的文件

一种简单的方法是为类命名名称空间,将它们全部放在一个目录中,然后创建一个自动加载文件(使用)。下面是一个快速(未经测试)的示例,说明如何实现这一点:

Inside/projectroot/lib,例如:

/projectroot/lib/MyDB.php

namespace MyProject;

if (!class_exists('\MyProject\MyDB')) {
    class MyDB {
        // Add some DB methods in here.
    }
}
/projectroot/lib/autoload.php

if (!defined('MYPROJECT_SPL_AUTOLOAD_REGISTERED')) {
    define('MYPROJECT_SPL_AUTOLOAD_REGISTERED', true);
    spl_autoload_register(function($class) {
        $class = explode($class, '\\');
        if (array_shift($class) === 'MyProject') {
            require __DIR__.'/'.join('/', $class);
        }
    });
}
然后,从您拥有的任何其他文件:

require '/projectroot/lib/autoload.php';

$db = new \MyProject\MyDB();

我意识到,最后一个选项并不能阻止您在每个文件中使用include,但您总是包含同一个文件(这样您就可以复制/粘贴),并且在您需要时,lib文件夹中正确命名的任何类都会自动包含在其中,因此它将处理的不仅仅是您的db文件。

感谢您提供的示例。我不确定我是否已经准备好自动预编。但它确实给了我一些想法,我可以做什么。谢谢你的样品。我不确定我是否准备好了