我看到了这个:
<?php
include( dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my_file.php');
?>
Run Code Online (Sandbox Code Playgroud)
为什么我需要这样做?为什么我会遇到获取dirname然后将其与目录分隔符和新文件名连接起来的麻烦?
以上代码与此不相同:
<?php
include( 'my_file.php' );
?>
Run Code Online (Sandbox Code Playgroud)
??
PHP文档说,
根据给定的文件路径包含文件,如果没有给出,则指定include_path.如果在include_path中找不到该文件,则include()最终将在调用脚本自己的目录和当前工作目录中检查失败.如果找不到文件,include()结构将发出警告; 这是require()的不同行为,会发出致命错误.
Cor*_*bin 66
假设我有一个(假的)目录结构,如:
.../root/
/app
bootstrap.php
/scripts
something/
somescript.php
/public
index.php
Run Code Online (Sandbox Code Playgroud)
现在假设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()的人将它从包含路径中移除,因为它们很少包含在同一目录中的文件(为什么在你知道包含时搜索当前目录永远不会在那里?).
注意:这个答案的大约一半是在一个相当古老的帖子中解决的:什么是更好的要求(dirname(__ FILE __).'/'.'myParent.php')而不仅仅是require('myParent.php')?
与接受的答案相比,我对这个问题的解释甚至可能更简单,所以我将尝试一下:假设这是项目文件和目录的结构:
Project root directory:
file1.php
file3.php
dir1/
file2.php
Run Code Online (Sandbox Code Playgroud)
(dir1是一个目录,file2.php并且在其中)
这是上面三个文件中每个文件的内容:
//file1.php:
<?php include "dir1/file2.php"
//file2.php:
<?php include "../file3.php"
//file3.php:
<?php echo "Hello, Test!";
Run Code Online (Sandbox Code Playgroud)
现在运行file1.php并尝试猜测应该发生什么。您可能希望看到“您好,测试!”,但是不会显示!相反,您将得到一个错误,指示您所请求的文件(file3.php)不存在!
原因是,file1.php当包含include时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!";
Run Code Online (Sandbox Code Playgroud)
如果您运行它,您将看到全能的Hello, Test!!(希望是,如果您没有做错其他任何事情)。
还值得一提的是,从PHP5开始,PHP还提供了一种更好的方法(关于可读性和防止眼睛bo!),它是一个常量__DIR__,它与dirname(__FILE__)!的作用完全相同。
希望能有所帮助。