我有一个包含几个类文件的包含文件:
|includes
|-> database.class.php
|-> user.class.php
|-> functions.php
etc ..在我的functions.php中包含所有类文件:
include_once 'database.class.php';
我想通过将结构更改为:
来从类文件中分离出一些标准文件|includes
|-> functions.php
|-> class
|-> database.class.php
|-> user.class.php
因此当我尝试使用glob
时:
foreach (glob('/class/*.class.php', GLOB_NOCHECK) as $filename) {
include_once $filename;
}
我收到以下错误:
警告:include_once(/ class / * .class.php):无法打开流:第13行/home/matt500b/dev2.csgoberry.com/includes/functions.php中没有此类文件或目录
我必须将其更改为:
glob('../../includes/class/*.class.php', GLOB_NOCHECK)
我希望能够理解正常include_once 'class/database.class.php';
的原因。
为什么glob依赖于用户所看到的文件而不是根据手册包含的函数文件?例如如果我深入了解文件结构:
|public
|-> tournament
|-> dir2
|-> index.php
我需要使用glob('../../../includes/class/*.class.php', GLOB_NOCHECK)
使用include '../../includes/functions.php';
总文件结构:
|includes
|-> database.class.php
|-> user.class.php
|-> functions.php
|public
|-> tournament
|-> index.php // Where the ../../includes/functions.php'; is
答案 0 :(得分:0)
你应该做的是使用$_SERVER['DOCUMENT_ROOT']
(假设你的包含在网站的根目录中),这样无论你在哪个页面上,PHP都会引用包含绝对路径的内容,从而使其完全灵活到任何地方。
所以:
include_once '../../class/database.class.php';
变为
include_once $_SERVER['DOCUMENT_ROOT']."/includes/class/database.class.php";
并且相同的方法可以应用于您网站上任何页面中的所有包含和相对路径功能(例如glob
)。
<强> WHY 强>
PHP使用当前目录作为&#34; base&#34;如果未完全指定文件夹,则为路径文件夹。
因此,如果您给PHP的路径被检测为绝对引用,例如/home/website/public_html/
,则使用绝对值,否则PHP使用current working directory。您可以手动更改PHP当前工作目录,但实际上,它仍然是相对更改,因此它更安全,更灵活,可以尽可能绝对地引用文件地址。
包含的文件使用它们所包含的文件的目录位置。当前工作目录是(如果不是手动更改)包含的文件的目录,而不是包含的文件的目录。