哪个是在require_once中使用realpath的更好方法

时间:2014-01-10 03:22:51

标签: php

我想知道,在2中,这是为realpath应用require_once的更好方法。我测试了两者,对我来说似乎没什么区别。但是,我可能会遗漏一些东西。

require_once( realpath( dirname( __FILE__ ) ).'/../../path/to/file.php' );

require_once( realpath( dirname( __FILE__ ) .'/../../path/to/file.php' ));

3 个答案:

答案 0 :(得分:1)

有趣的问题。我更愿意使用第二个例子:

require_once( realpath( dirname( __FILE__ ) .'/../../path/to/file.php' ));

主要是因为我觉得自己上升了从长远来看,../..的结构似乎令人困惑。特别是在调试时。

但是现在我正在使用以下代码在开发环境中测试它:

echo 'Realpath All: ' . realpath( dirname( __FILE__ ) .'/../../path/to/file.php' );
echo '<br />';
echo 'Realpath Dir: ' . realpath( dirname( __FILE__ ) ).'/../../path/to/file.php';

输出显示使用realpath表示整个路径的缺陷:

Realpath All: 
Realpath Dir: /Applications/MAMP/htdocs/../../path/to/file.php

如果拼写错误或错误导致路径无效,realpath只会返回null。似乎不是一种可行的调试方法。

所以我现在更喜欢使用这种方法:

require_once( realpath( dirname( __FILE__ ) ).'/../../path/to/file.php' );

如果路径是真实的,那么有效的路径将是无效的:

/Applications/MAMP/htdocs/../../path/to/file.php

这在调试中比在没有任何内容时更有用。

答案 1 :(得分:1)

恕我直言,第一个实际上并没有多大意义,所以我建议使用第二个或已经注释的解决方案。我为什么这么说?你有这个代码:

require_once( realpath( dirname( __FILE__ ) ).'/../../path/to/file.php' );

可以扩展,相当于:

$dir = realpath( dirname( __FILE__ ) );
require_once( $dir .'/../../path/to/file.php' );

从文档中,我们可以看到realpath() expands all symbolic links and resolves references to '/./', '/../' and extra '/' characters in the input path and returns the canonicalized absolute pathname.。这意味着您实际上没有使用realpath函数来消除这些/../../,因为您正在使用realpath进行连接 。因此,在所需的字符串中,这些点仍然存在。

此外,再次从文档中realpath() returns FALSE on failure, e.g. if the file does not exist.这意味着,在第一种情况下,如果目录不是文件,它将会失败。这基本上总是如此。所以代码可以更好地扩展到这个:

$dir = false;
require_once( $dir . '/../../path/to/file.php' );

因此,仅在需要该文件的脚本与主执行脚本位于同一目录的情况下才有效,该路径只是相对于此执行脚本的路径

注意:如果我没有充分解释,请说出来,我会扩展解释。

答案 2 :(得分:0)

在第一个例子中,realpath()可能永远不会有任何影响,因为__FILE__不太可能包含/../或类似的东西。既然你的道路确实存在,那么只有第二种方式才有意义。

他们都工作,但

require_once( dirname( __FILE__ ) .'/../../path/to/file.php' );

也会起作用,并且和第一个例子一样。