我见过这个:
<?php
include( dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my_file.php');
?>
为什么我需要这样做?为什么我会遇到获取dirname然后将其与目录分隔符和新文件名连接起来的麻烦?
上面的代码是否与此不相符:
<?php
include( 'my_file.php' );
?>
...
根据给定的文件路径包含文件,如果没有给出,则指定include_path。如果在include_path中找不到该文件, include()将最终检入调用脚本自己的目录和当前工作目录,然后再失败。如果找不到文件,include()结构将发出警告;这是require()的不同行为,会发出致命的错误。
答案 0 :(得分:60)
我们说我有一个(假的)目录结构,如:
.../root/
/app
bootstrap.php
/scripts
something/
somescript.php
/public
index.php
现在假设bootstrap.php
包含了一些用于设置数据库连接或其他类型的boostrapping内容的代码。
假设您要在boostrap.php
的名为init.php
的文件夹中加入一个文件。现在,为避免使用include 'init.php'
扫描整个包含路径,您可以使用include './init.php'
。
但是有一个问题。 ./
与包含bootstrap.php
而非bootstrap.php
的脚本相关。 (从技术上讲,它将与工作目录相关。)
dirname(__FILE__)
允许您获取绝对路径(从而避免包含路径搜索),而不依赖于工作目录作为bootstrap.php
所在的目录。
(注意:自PHP 5.3起,您可以使用__DIR__
代替dirname(__FILE__)
。)
现在,为什么不使用include 'init.php';
?
虽然起初很奇怪,但.
并不保证在包含路径中。有时为了避免无用的stat()
人将它从包含路径中删除,因为它们很少包含在同一目录中的文件(为什么在知道包含时搜索当前目录永远不会在那里?)。
注意:这个答案的大约一半是在一个相当古老的帖子中提到的:What's better of require(dirname(__FILE__).'/'.'myParent.php') than just require('myParent.php')?
答案 1 :(得分:5)
与接受的答案相比,我对这个问题的解释甚至可能更简单,所以我将尝试一下:假设这是项目文件和目录的结构:
Project root directory:
file1.php
file3.php
dir1/
file2.php
({dir1
是目录,file2.php
在其中)
这是上面三个文件中每个文件的内容:
//file1.php:
<?php include "dir1/file2.php"
//file2.php:
<?php include "../file3.php"
//file3.php:
<?php echo "Hello, Test!";
现在运行file1.php
并尝试猜测应该发生什么。您可能希望看到“您好,测试!”,但是不会显示!相反,您将得到一条错误消息,指示您请求的文件(file3.php
)不存在!
原因是,在file1.php
中,当您包含file2.php
时,其内容将被复制,然后直接粘贴回位于根目录中的file1.php
中,因此部分"../file3.php"
从根目录运行,因此在根目录上移了一个目录!(显然找不到file3.php
)。
现在,我们该怎么办?!
相对路径当然存在上面的问题,因此我们必须使用绝对路径。但是,绝对路径也有一个问题。如果您(例如)复制根文件夹(包含整个项目)并将其粘贴到计算机上的其他任何位置,则从那时起路径将无效!那将是一个真正的短消息!
因此,我们需要一种既是绝对路径又是动态路径的路径(每个文件都可以动态地找到其放置在任何地方的绝对路径)!
我们这样做的方法是从PHP获得帮助,dirname()
是要使用的函数,它提供了文件所在目录的绝对路径。每个文件名也可以是使用__FILE__
常量可以轻松访问。因此,dirname(__FILE__)
可以轻松为您提供我们在上面的代码中键入的文件的绝对路径(同时是动态的!)。现在,将您的整个项目移到一个新的地方,甚至是一个新的系统,再来吧!它有效!
现在,如果我们将上面的项目转到此:
//file1.php:
<?php include(dirname(__FILE__)."/dir1/file2.php");
//file2.php:
<?php include(dirname(__FILE__)."/../file3.php");
//file3.php:
<?php echo "Hello, Test!";
如果您运行它,将会看到全能的Hello, Test!
! (希望是,如果您没有做错其他任何事情)。
值得一提的是,从PHP5开始,PHP还提供了一种更好的方式(关于可读性和防止眼睛沸腾!),这是常量__DIR__
,与dirname(__FILE__)
完全一样!
希望有帮助。
答案 2 :(得分:0)
如果您希望代码在具有不同环境的多台服务器上运行,那么我们就需要 在include或include_once语句中使用dirname( FILE )。 原因如下。 1.不要给出在服务器上包含文件的绝对路径。 2.动态计算绝对路径的完整路径。
使用dirname( FILE )和后续调用的组合,直到到达'/myfile.php'的主页。 然后附加包含所包含文件路径的变量。
答案 3 :(得分:0)
如果这是您的想法,我在下面使用了这个。它对我来说效果很好。
<?php
include $_SERVER['DOCUMENT_ROOT']."/head_lib.php";
?>
我试图做的是从根文件夹中调用/head_lib.php的pulla文件。它不会拉动任何东西来构建网页。子目录中的页眉,页脚和其他关键功能永远不会显示。直到我在上面做了它就像一个冠军。