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

In php do we need to do include in all files or is there a better way?

我在根文件夹中有一个数据库配置 (db.php)

MySQL 与 PDO_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';

在所有 PHP 个需要数据库连接的文件中。

我的问题是每次我需要数据库连接时我都需要做 "include" 还是有办法设置这个连接设置为全局这样我就可以在任何地方调用 $DBH->prepare(SQLSTATEMENT)在项目中,它将起作用。

或者是否有更好的方法来处理数据库连接设置?

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

长答案...PHP 不会在每次脚本 运行 时加载每个存在的 PHP 文件,因此它必须知道您的 [=75] =] 来自。但是,有几种方法可以不必每次都包含 db 文件。你的选择是你可以 auto-prepend 文件,你可以从另一个已经设置了 db 变量的文件中包含你的文件,或者你可以设置你的代码以面向对象的方式启动并包含一个自动加载文件。

auto-prepend

如果您在此服务器上的每个文件都需要访问数据库并且您有权访问php.ini文件,您可以设置auto-prepend-file php.ini 中的选项。这将自动将文件包含在 每个 文件中,就像由 require 加载一样。如果你走这条路,请确保你正在检查你的数据库文件是否已经加载:

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 并根据路径加载页面。该文件中包含的页面可以访问该文件中的变量。如何设置它的一个简单示例可能是这样的:

.htaccess 在根目录中(假设启用 mod_rewrite)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.* /index.php

这将通过您的 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(面向对象)设计并包括自动加载

最常见的方法(恕我直言,最好的方法)是以面向对象的方式构建代码并只包含自动加载文件。一个很好的例子是作曲家如何将依赖项安装到您的项目中并生成要包含的 vendor/autoload.php 文件。

一个简单的方法是为您的 classes 命名空间,将它们全部放在一个目录中,然后创建一个自动加载文件(使用 spl_autoload_register)。这是一个快速(未经测试)的示例,说明您如何完成此操作:

里面 /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,但你总是包含相同的文件(所以你可以 copy/paste),以及任何 class 在您的 lib 文件夹中正确命名空间将在您需要时自动包含在内,因此它不仅仅适用于您的数据库内容。