PHP包含奇怪的行为?

时间:2010-01-18 17:38:30

标签: php file include

出于某种原因,如果我inlcude()文件结构中的文件比调用include()的文件更深,则它可以正常工作,或者如果我在同一级别包含文件。

如果我试着去include('../backFile.php')它告诉我没有档案?

任何帮助:(

6 个答案:

答案 0 :(得分:3)

我不完全确定你的具体情况。可能有一个简单的解决方案,包括工作。该修复可能会在另一个答案中提供。

相反,我会给你一个best-practice(好吧,也许不是'最好',但是一个好习惯):

在您调用的第一个文件或配置文件中,定义一个常量,该常量是包含文件的第一个目录的路径。

因此,如果您正在使用/home/user/domains/test.com/

DEFINE('SITE_PATH', '/home/user/domains/test.com/');

然后,无论何时包含某些内容,请将其作为起点

include(SITE_PATH . "lib/test.class.php");

这将确保PHP使用文件的完整路径,而您不必担心相对包含该文件。

当您更改文件位置时,这非常有用,因为您在移动包含所有内容的文件时无需更改包含。

答案 1 :(得分:3)

除了其他人所说的realpath所有内容......例如:

include(realpath(dirname(__FILE__).'/../myFile.php'));

答案 2 :(得分:1)

试试这个:

include('./../backFile.php');

答案 3 :(得分:1)

您应该尝试将其基于当前目录:

include(getcwd() . '../backFile.php');

答案 4 :(得分:0)

include取决于php的include_path指令,默认情况下为.(当前执行脚本所在的目录)。

使用ini_setset_include_path设置您自己的include_path。

答案 5 :(得分:0)

当您在include的参数中指定路径(绝对路径或相对路径)时,它不使用系统包含路径,而是解析相对于“主”文件的路径 ,通常是某种index.php

例如,您有三个文件/www/index.php

<?php
include('libs/init.php');

/www/test.php

I was included!    

/www/libs/init.php

<?php
include('../test.php');

include('../test.php')调用将使用index.php的目录上下文解析,/www,而不是/www/test.php您实际上正在尝试包含/test.php 1}}。

说实话,我不知道它为什么会这样。我的libs/init.php解决了这个问题:

define('DIR_ROOT', str_replace('\\', '/', dirname(dirname(__FILE__))));

然后用它预先添加所有路径。 str_replace调用是为了更顺畅地处理Windows路径。