我想知道,在2中,这是为realpath
应用require_once
的更好方法。我测试了两者,对我来说似乎没什么区别。但是,我可能会遗漏一些东西。
require_once( realpath( dirname( __FILE__ ) ).'/../../path/to/file.php' );
或
require_once( realpath( dirname( __FILE__ ) .'/../../path/to/file.php' ));
答案 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' );
也会起作用,并且和第一个例子一样。