让我首先演示我的文件结构。
/www/
myfile.php
anotherC.php
a/
b.php
c.php
myfile.php
内的代码是:
<?php
include_once("a/b.php");
?>
b.php
内的代码是:
<?php
include_once("c.php");
?>
最后在c.php
内:
<?php
echo "hello i'm C.php";
?>
所以,当我打电话给www/myfile.php
时,我得到输出:
你好我是C.php
这些工作正常。但是,让我将b.php
更改为
<?php
include_once("../anotherC.php"); //or include_once("./c.php"); (it won't work too)
?>
现在,当我拨打www/myfile.php
时,我收到错误:
警告:include_once(../ anotherC.php):无法打开流:没有这样的 第2行/home/hasib/Desktop/www/a/b.php中的文件或目录 警告:include_once():打开'../anotherC.php'失败 包含(include_path ='。:/ usr / share / php:/ usr / share / pear')in 第2行/home/hasib/Desktop/www/a/b.php
现在我的问题是,为什么include_once("c.php");
完美无缺?
答案 0 :(得分:1)
如果在include_path中找不到该文件,include将最终在失败前检查调用脚本自己的目录和当前工作目录。
如果定义了一个路径 - 无论是绝对路径(从Windows上的驱动器号或者\或Unix / Linux系统上的/开始)还是相对于当前目录(以。或..开头) - include_path将被忽略共。例如,如果文件名以../开头,则解析器将查找父目录以查找所请求的文件。
你的例子中的'调用脚本'是b.php,显然它是directoy是'/ www / a /'。
你可以使用getcwd()获取'当前目录',在myfile.php或b.php中,它将返回'/ www /'
所以当include_once(“c.php”);它首先在调用脚本的目录中查找c.php,即/ www / a /,并成功获取c.php。
当include_once(“../ anotherC.php”); ,它只查找当前目录的相对路径中的anotherC.php,当前目录是/ www /,所以它在/中查找anotherC.php,/ anotherC.php不存在并抛出警告。
答案 1 :(得分:0)
相对路径的包含总是相对于MAIN脚本完成的。 include()
的运行方式基本上与您将包含的数据直接粘贴到主脚本中的方式相同。因此,当您执行子包含时,他们会使用您的myFile.php
脚本的工作目录,而不是b.php
或c.php
的工作目录。
你的子脚本需要在他们的icnldues中有一个绝对路径,或者至少某种“我在哪里”的决定代码,例如: include(__FILE__ . 'c.php')
答案 2 :(得分:0)
我能想到这个工作的唯一原因是你/www/a
中有include_path
。这意味着include_once("c.php")
将首先查找/www/c.php
(因为这是当前的工作目录),然后查找将找到并工作的/www/a/c.php
。
但是,include_once("./c.php")
明确指出只查看当前工作目录,当然因为文件不存在,所以它不起作用。