Php 包含在包含中

Php 包含在包含中,php,dom,Php,Dom,我的PHP代码中有一些问题 我有3个文件: ./foo1.php <?php include './temp/foo2.php'; ?> _________________________________________ ./temp/foo2.php <?php include '../php/print.php' ; ?> _______________________________________ ./php/print.php <?php echo 'fo

我的PHP代码中有一些问题

我有3个文件:

./foo1.php
<?php include './temp/foo2.php'; ?>
_________________________________________
./temp/foo2.php
<?php include '../php/print.php' ; ?>
_______________________________________
./php/print.php
<?php echo 'foo!'; ?>
/foo1.php
_________________________________________
./temp/foo2.php
_______________________________________
./php/print.php
当然,如果我转到./foo1.php,将不会打印任何内容(我想要'foo!'),但如果我转到./temp/foo2.php,将不会打印'foo!'将被打印出来(可以)。当PHP在递归模式下包含phpfiles时,问题就解决了。。。我的问题是如何解决这个问题

更新:这是解决方案:


$\u服务器['DOCUMENT\u ROOT']
->在PHP句柄嵌套之前使用绝对路径即可

问题在于,您提供的是相对路径,并且进程的当前目录(路径相对的)不会根据您当时所在的文件而改变

相对路径没有问题,多个入口点(即直接调用每个脚本)也没有问题。如果你没有像你发现的那样采取适当的措施来混合这些东西,你确实会遇到问题

如果您不需要多个入口点,那么只需忘记直接调用单个脚本以外的任何东西,并创建相对于该脚本目录的路径


如果您确实需要多个入口点,那么每个脚本都必须能够以某种方式检测其在应用程序根目录中的位置,并相应地构造相对路径。

PHP句柄嵌套包含很好

问题在于,您提供的是相对路径,并且进程的当前目录(路径相对的)不会根据您当时所在的文件而改变

相对路径没有问题,多个入口点(即直接调用每个脚本)也没有问题。如果你没有像你发现的那样采取适当的措施来混合这些东西,你确实会遇到问题

如果您不需要多个入口点,那么只需忘记直接调用单个脚本以外的任何东西,并创建相对于该脚本目录的路径


如果您确实需要多个入口点,那么每个脚本都必须能够以某种方式检测其在应用程序根中的位置,并相应地构造相对路径。

这不是因为PHP需要“递归”地包含文件。根据客户的评论:

记住,如果文件A包括文件B,而B包括文件C;B中的include路径应该考虑到A而不是B是活动工作目录

您的工作目录是
,您正在通过
foo2.php
包含
。/php/print.php
,无法找到该目录。顺便说一句,如果你检查你的日志,你会看到一个警告被发出

要正确解决此问题,请使用基本路径,从中包括所有内容,例如:

define("BASE", "/var/www/html");

include(BASE."/temp/foo2.php");
include(BASE."/php/print.php");

这样,代码也很容易重新定位。

这不是因为PHP需要“递归”地包含文件。根据客户的评论:

记住,如果文件A包括文件B,而B包括文件C;B中的include路径应该考虑到A而不是B是活动工作目录

您的工作目录是
,您正在通过
foo2.php
包含
。/php/print.php
,无法找到该目录。顺便说一句,如果你检查你的日志,你会看到一个警告被发出

要正确解决此问题,请使用基本路径,从中包括所有内容,例如:

define("BASE", "/var/www/html");

include(BASE."/temp/foo2.php");
include(BASE."/php/print.php");

这样,您的代码也很容易重新定位。

这3个文件的目录结构是什么?您使用的是相对路径。如果您从不同的启动目录运行脚本,那么是的,它将不起作用,因为相对路径将与错误的基本目录相对。没有递归-没有递归…3个文件的目录结构是什么?您使用的是相对路径。如果您从不同的启动目录运行脚本,那么是的,它将不起作用,因为相对路径将与错误的基本目录相对。没有递归-没有递归…
请记住,如果文件A包括文件B,而B包括文件C;B中的include路径应该考虑到A而不是B是活动工作目录。
如果我只想对文件A进行操作,但我想对A和B进行操作,这是正确的both@JanQ我不明白你说的“操作”是什么意思。这就是
include
的工作原理,也是您的呼叫失败的原因。如果要成功地从这两个文件中包括
print.php
,必须使用绝对路径。例如,按照我描述的方式,绝对路径是有效的(逻辑的)。为什么如果你做了
$BASE='/var/www/html'
,它就不起作用了?@JanQ这也行,但我通常用define来定义它们。它毕竟不是一个变量。这样,在函数/类中不需要
全局
,也不能给它赋值:
记住,如果文件A包括文件B,而B包括文件C;B中的include路径应该考虑到A而不是B是活动工作目录。
如果我只想对文件A进行操作,但我想对A和B进行操作,这是正确的both@JanQ我不明白你说的“操作”是什么意思。这就是
include
的工作原理,也是您的呼叫失败的原因。如果要成功地从这两个文件中包括
print.php
,必须使用绝对路径。例如,按照我描述的方式,绝对路径是有效的(逻辑的)。为什么如果你做了
$BASE='/var/www/html'
,它就不起作用了?@JanQ这也行,但我通常用define来定义它们。它毕竟不是一个变量。这样,您就不需要在函数/类中使用
global
,也无法为其分配其他值: