为什么我会在include或include_once语句中使用dirname(__ FILE__)?
我看过这个:
<?php include( dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my_file.php'); ?>
为什么我需要这样做? 为什么我会去麻烦获取dirname,然后连接到一个目录分隔符和一个新的文件名?
上面的代码是不是等同于这个:
<?php include( 'my_file.php' ); ?>
??
PHP文档说,
包含的文件基于给定的文件path,如果没有给出,则指定include_path。 如果在include_path中找不到该文件, include()将最终在调用脚本自己的目录和当前工作目录中检查失败之前。 如果include()构造找不到文件,将会发出警告; 这是与require()不同的行为,它会发出致命的错误。
假设我有一个(假的)目录结构,如:
.../root/ /app bootstrap.php /scripts something/ somescript.php /public index.php
现在假定bootstrap.php
包含一些代码,用于设置数据库连接或其他types的增强function。
假设你想在boostrap.php
文件夹中包含一个名为init.php
的文件。 现在,为了避免使用include 'init.php'
扫描整个包含path,可以使用include './init.php'
。
虽然有一个问题。 那个./
将和包含bootstrap.php
的脚本相关,而不是bootstrap.php
。 (从技术上讲,这将是相对于工作目录。)
dirname(__FILE__)
允许您获取绝对path(从而避免包含pathsearch),而不依赖于工作目录是bootstrap.php
所在的目录。
(注意:从PHP 5.3开始,可以使用__DIR__
来代替dirname(__FILE__)
。)
现在,为什么不使用'init.php';
?
尽pipe起初很奇怪,但是.
不能保证在包含path中。 有时候为了避免无用的stat()
的人把它从包含path中移除,当它们很less包含在同一个目录中的时候(为什么当你知道包含的时候search当前目录永远不会在那里?
注意:这个答案的大约一半是在一个相当老的post中的地址: 什么是更好的要求(dirname(__ FILE __)。'/'。'myParent.php')而不仅仅是要求('myParent.php')?
如果您希望代码在具有不同环境的多个服务器上运行,则需要在include或include_once语句中使用dirname( FILE )。 原因如下。 1.不要给你的服务器包含文件的绝对path。 2.像绝对path一样dynamic计算完整path。
使用dirname( FILE )和后续调用的组合,直到到达“/myfile.php”的起始位置。 然后将包含该path的variables附加到包含的文件中。
我在下面使用这个,如果这是你在想什么。 它对我来说效果很好。
<?php include $_SERVER['DOCUMENT_ROOT']."/head_lib.php"; ?>
我想要做的是从根文件夹中调用/ head_lib.php pulla文件。 它不会拉任何东西来build立网页。 子目录中的页眉,页脚和其他主要function将永远不会显示出来。 直到我做了上面,它像一个冠军。