以前在阅读一些PHP框架源代码的时候,奇怪的是包含文件的时候会用dirname(__FILE__)来拼凑文件路径。我不知道它会有什么好处,但我终于找到了原因。
让我们看一个简单的例子:
有三个php文件:a、b和C.b.php在网站根目录,b.php在B文件夹——b/b.php,c.php在C文件夹3354c/c.php,有些混乱?看了一眼图片:
A.php和d.php都包含d.php,最后d.php在d文件夹下包含一个php文件——d/d.php。
我们先来看一个. php:
?php $ file _ name=' a.phpecho“这是一个. PHP”;echo ' hr需要(' c/c . PHP ');很简单的代码,打印后,包含c/c.php,那么,我们需要看c/c.php:
?php $ c _ file _ name=' c.php回声'这是c.php,是所要求的'。$ file _ nameecho ' hr要求('./d/d . PHP ';打印出‘这是a.php,是一个. php所需要的’,$file_name是一个在a.php定义的变量。最后,d.php被包括在内。因为D文件夹在当前c.php文件的上层,根据常识,我们自然会把路径写成./d/d.php。但不幸的是,它会报告一个错误。原因是在包含的文件中,如c.php,然后包含其他文件,路径是相对于最外层的父文件,即相对于a.php。可以理解为,因为你被我包容,所以你要以我为标准。看起来很神秘,但原理其实很简单:可以放require(' c/c . PHP ');可以把它想象成c/c.php文件中的代码,这样我们的c.php就可以看起来像这样:
?php $ file _ name=' a.phpecho“这是一个. PHP”;echo ' hr//require(' c/c . PHP ');$ c _ file _ name=' c.php回声'这是c.php,是所要求的'。$ file _ nameecho ' hr要求('./d/d . PHP ';此时,您可以看到,当我们想要包含d/d.php文件时,路径是否只是错误的?因为,现在在d.php的代码中,我们是相对于d.php文件的,当然,路径应该是require(' d/d . PHP ');没错。我们对代码进行了如下修改:
?php $ file _ name=' a.phpecho“这是一个. PHP”;echo ' hr//require(' c/c . PHP ');$ c _ file _ name=' c.php回声'这是c.php,是所要求的'。$ file _ nameecho ' hr需要(' d/d . PHP ');此时,你还没有意识到深层含义,你需要往下看,我们来看看b/b.php:
?php $ file _ name=' b.phpecho“这是b . PHP”;echo ' hr要求('./c/c . PHP ');没必要解释,没问题,但是当你把require(’./c/c . PHP ');当您更改为c/c.php中的代码时,您会发现问题。请注意,我们刚刚修改了c/c.php中的代码,并放入了require('./d/d . PHP ';已更改为require(' d/d . PHP ');查看以下包含的代码:
?php $ file _ name=' b.phpecho“这是b . PHP”;echo ' hr//要求('./c/c . PHP ');$ c _ file _ name=' c.php回声'这是c.php,是所要求的'。$ file _ nameecho ' hr需要(' d/d . PHP ');然后,与b/b.php相比,要求(' d/d . PHP ');路径错误,它应该是必需的('./d/d . PHP ';没错。您可以返回并修改c/c.php中的require路径,但这是错误的。更改后,b/b.php可以正常运行,但a/a.php不能再次工作。他们共享c/c.php是真的吗,那怎么办?
这时我们回到文章开头提到的dirname(__FILE__),这是一件好事,完全可以解决上面的问题。有了它,你不需要关心哪个文件包含你,它在哪个路径下,也不需要担心父文件的级别,因为dirname(__FILE__)可以指定相对于当前文件的路径。也就是说,我们需要将c/c.php中的require路径更改为:
?php $ c _ file _ name=' c.php回声'这是c.php,是所要求的'。$ file _ nameecho ' hr需要(dirname(__FILE__)。'/./d/d . PHP ';这里,我们只需要使用c/c.php作为参考。与之相比,d/d.php处于上层。这样的话,只有一个标准,那就是以我为准,不管你包括我还是他包括我,我都只会以我自己为准,我想包括的文件都只是相对于我自己的。
对于不懂dirname(__FILE__)的同修,请谷歌一下。很简单。
好了,PHP技术分享到此结束。如果您有任何问题或错误,请留言。换句话说,这是我的第一篇标准技术博文。第一个是水文,第二个是准技术。今天,我终于写了一篇关于技术的论文。