PHP:我猜,对文件路径感到困惑,包括没有按应有的方式工作
我有以下目录结构:PHP:我猜,对文件路径感到困惑,包括没有按应有的方式工作,php,model-view-controller,include,filesystems,require,Php,Model View Controller,Include,Filesystems,Require,我有以下目录结构: --root |--datasource | '--datasource.php | |--public_html | '--app | |--view | |--model | |--core | '--App.php | |--controler | |--init.php | |-----css |
--root
|--datasource
| '--datasource.php
|
|--public_html
| '--app
| |--view
| |--model
| |--core
| '--App.php
| |--controler
| |--init.php
|
|-----css
|-----js
|-----index.php
我的init.php(来自“app”目录)包含在index.php中,它包含我的项目的所有其他重要include:
app/init.php:
require_once '../../datasource/datasource.php'; --> Not working
//require_once '../datasource/datasource.php'; --> Working
require_once 'app/core/App.php'; --> Working
//FUN PART:
require_once 'core/App.php'; --> Still working, wtf?
echo getcwd(); //gives: /home/prbh0pr/public_html
问题:为什么我的“../../datasource/datasource.php”包含失败?更重要的是,“core/App.php”为什么没有失败
我试着去想这件事,但不知道发生了什么
index.php
<?php
require_once 'app/init.php';
$app = new App;
?>
首先,使用
。/../datasource/datasource.php
失败,因为当前目录是public\u html
,并且您使用的是相对路径
使用。在包含路径中,允许相对包含,因为它表示当前目录。但是,显式使用include“./file”比让PHP始终检查当前目录中的每个include更有效
发现于
app/core/app.php
和core/app.php
正在工作,因为
根据给定的文件路径包含文件,如果未给定,则根据指定的包含路径包含文件。如果在include_路径中找不到该文件,include将在失败之前最终签入调用脚本自己的目录和当前工作目录。如果include构造找不到文件,它将发出警告;这与require不同,require将发出致命错误
可在有关include的文档中找到
app/core/app.php
可在当前工作目录(home/prbh0pr/public_html
)中找到,core/app.php
可使用调用脚本自己的目录(~/public_html/app
)找到。首先用
。/../datasource/datasource.php
失败,因为当前目录是public\u html
,并且您使用的是相对路径
使用。在包含路径中,允许相对包含,因为它表示当前目录。但是,显式使用include“./file”比让PHP始终检查当前目录中的每个include更有效
发现于
app/core/app.php
和core/app.php
正在工作,因为
根据给定的文件路径包含文件,如果未给定,则根据指定的包含路径包含文件。如果在include_路径中找不到该文件,include将在失败之前最终签入调用脚本自己的目录和当前工作目录。如果include构造找不到文件,它将发出警告;这与require不同,require将发出致命错误
可在有关include的文档中找到
app/core/app.php
可在当前工作目录(home/prbh0pr/public_html
)中找到,core/app.php
可使用调用脚本自己的目录(~/public_html/app
)找到。尝试在路径前面添加//code>。还要检查是否有任何setcwd()
调用。第一个调用不起作用,因为在。/../../
之后,您将位于根目录后面(public\u html/../
是root
,public\u html/../../
是根目录的父目录)。第二个,除了setcwd
之外,还要检查\uuu autoload
和spl\u autoload\u寄存器
尝试在路径前面添加/
。还要检查是否有任何setcwd()
调用。第一个调用不起作用,因为在。/../../
之后,您将位于根目录后面(public\u html/../
是root
,public\u html/../../
是根目录的父目录)。第二个,除了setcwd
之外,还应检查\u自动加载
和spl\u自动加载