统一路径要求PHP中的文件从所有文件夹中取出


Unified path to require a file in PHP from all folders

我有当前树。

/edu/index.php
/edu/Classes/Connection.php
/edu/Classes/User.php
/edu/Handlers/Post.php

当我需要在index.php中使用Connection.phpUser.php的函数时,我要求它们使用:

require_once './Classes/Connection.php';
require_once './Classes/User.php';

但是User.php的一些功能也需要Connection.php的功能来工作,所以由于index.php是请求来自的地方,我需要Connection.phpUser.php内使用:

require_once './Classes/Connection.php';

但有时我需要使用与Post.php相同的函数,所以

如果Post.php是发送请求的文件,则require_once './Classes/Connection.php';User.php中不起作用。

是不是有一个统一的路径或解决方案,使我能够要求文件从任何地方在我的项目以同样的方式?我真的希望避免像……这样的解决方案。

public function UserFunction($path){
  require_once $path;
}

并根据我在项目文件夹中的位置更改每次调用的参数

如果您试图包含的文件主要是类,那么最好实现__autoload函数。当您实例化一个类时,如果还没有定义这个类,那么用类名调用__autoload方法,这样您就可以包含这个文件。如果你创建一个简单的标准,就像所有的类都在$_SERVER['DOCUMENT_ROOT'].'/classes/'文件夹中,文件名与ClassName.php这样的类名相同,你可以动态加载任何需要的类。

而且,通常被看不起,但我想我应该提到它,因为我还没有看到它提供。您可以调用set_include_path()函数,该函数允许您设置php在包含文件时查找的路径。然而,这可能会引起一些麻烦。例如,我的工作在子域下托管了几个站点,每个站点都有自己的文档根。在文档根目录下,每个站点都有自己的"includes"文件夹。8年前,一些天才将apache全局配置中的include路径设置为/var/www/site1/includes;/var/www/site2/includes...etc。问题是,当site1中存在与site2同名的文件并且您试图包含它时,您将始终包含来自site1的文件,因为php会在那里找到该文件并停止查找。

最好的方法是包含相对于__DIR__来获得相对于另一个文件的文件。

其他可以包含from的优点是

$_SERVER["DOCUMENT_ROOT"]

或者使用htaccess自己创建。

in .htaccess put

SetEnv MY_INCLUDE_PATH "/path/to/my/php/files";

then in PHP

include ($_SERVER["MY_INCLUDE_PATH"]."/Connection.php");