我正在开发一个关于MAMP的PHP程序,并且刚刚实现了以下棘手的行为:
echo "<br/>PATH = ".dirname(__FILE__);
include 'include.php';
include.php:
<?php
echo "<br/>PATH = ".dirname(__FILE__);
?>
结果:
PATH = / users / me / stuff / mamp_server / my_site(全部小写)
PATH = / Users / me / Stuff / mamp_server / my_site(Mixed case)
导致这种不一致行为的原因是什么,我该如何防范它? (请注意,我不能只将所有内容转换为小写,因为应用程序的目的地是Linux服务器,其中文件路径区分大小写。)
更新
__FILE__
和__DIR__
存在此问题。
看起来这可能是一个真正的问题,没有解决方法......除非我另有说明,否则将提交错误报告。
错误报告:
https://bugs.php.net/bug.php?id=60017
更新:
另一个注意事项:如果您在Mac上执行绝对路径包含(...),则需要混合大小写版本。
答案 0 :(得分:2)
我在MAC OS X上开发PHP时遇到了类似的问题。您可以使用区分大小写的文件系统进行格式化,但如果您使用的是Adobe的设计软件,则可能会遇到麻烦:http://forums.adobe.com/thread/392791
真正的问题是,据说不区分大小写的文件系统实际上是部分不区分大小写的。您可以在同一目录中创建名为“Filename”和“filename”的两个文件,但“Filename”和“filename”可能指向两个文件:http://systemsboy.com/2005/12/mac-osx-command-line-is-partially-case-insensitive.html
答案 1 :(得分:1)
如何在与应用程序相同的目录中创建包含文件。
<?php return __DIR__; ?>
像这样使用它:
$trueDIR = include('get_true_dir.php');
根据您在上面发布的内容,这应该可行。是的,这是一个hacky解决方法,但它是一种解决方法,甚至应该在没有遇到这个问题的系统上工作。
答案 2 :(得分:1)
这是我用来获取给定文件名的正确大小的代码:
function get_cased_filename($filename)
{
$globbable = addcslashes($filename, '?*[]\\');
$globbable = preg_replace_callback('/[a-zA-Z]/', 'get_bracket_upper_lower', $globbable);
$files = glob($globbable);
if (count($files)==1)
{
return $files[0];
}
return false;
}
function get_bracket_upper_lower($m)
{
return '['.strtolower($m[0]).strtoupper($m[0]).']';
}
glob应该只匹配一个文件,但如果在区分大小写的文件系统上使用它可以匹配更多 - 所需的行为取决于你 - 例如,仍然返回[0]
或抛出E_NOTICE
什么的。
您可能会发现它很有用:$mydir = get_cased_filename(dirname(__FILE__));
适用于Mac 10.6.8上的CLI PHP 5.3.6。
我用它来处理那些没有注意到“Filename”和“filename”之类的东西的同事。 (这些人也想知道为什么包含“&gt;”或“?”的文件名在从Mac复制到Windows服务器时不起作用,但我离题了......)
答案 3 :(得分:0)
我使用的是apache,我发现执行文件的__DIR__
与apache配置的DOCUMENT_ROOT中找到的文件相同。
这意味着如果apache配置有
DocumentRoot /users/me/stuff/my_site
问题的脚本是打印:
PATH = /users/me/stuff/my_site (All lower case)
PATH = /Users/me/stuff/my_site (Mixed case)
如果apache配置有:
DocumentRoot /Users/me/stuff/my_site
问题的脚本是打印:
PATH = /Users/me/stuff/my_site (Mixed case)
PATH = /Users/me/stuff/my_site (Mixed case)
哪个更好。
如果遇到此问题,请检查apache配置,并考虑它是区分大小写的。