gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:40:34 24 4
gpt4 key购买 nike

我在根文件夹中有一个数据库配置(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”,或者有没有办法设置这个连接设置为 Global 这样我就可以在项目的任何地方调用 $DBH->prepare(SQLSTATEMENT) 并且它会起作用。

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

最佳答案

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

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

自动添加

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

你的数据库文件.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(面向对象)设计并包括自动加载

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

一个简单的方法是为您的类命名空间,将它们全部放在一个目录中,然后创建一个自动加载文件(使用 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,但你总是包含相同的文件(这样你就可以复制/粘贴),并且在你的 lib 文件夹中正确命名的任何类都会在您需要时自动包含在内,因此它不仅仅适用于您的数据库内容。

关于php - 在 php 中,我们需要在所有文件中包含还是有更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42121813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com