下面是我的class脚本:
class.php
<?php
class testing {
function hurray () {
echo "Works.";
}
}
我的调用脚本是:
test.php
<?php
include_once "class.php";
include_once "claSs.php";
$a = new testing();
$a->hurray();
当我尝试执行test.php
php test.php
我得到下面的错误:
PHP致命错误:Cannot redeclare class testing in/private/var/www/temp/class . PHP on line 2
*Nix OS支持不区分大小写的文件系统,这意味着它可以理解用于引用文件名的大小写。上面的脚本加载了相同的文件,Mac或PHP认为这是一个不同的文件,并在运行时加载它,导致上述错误。
我的问题:
- Mac OS X认为这是两个不同的文件吗?PHP认为这是两个不同的文件吗?我对此表示怀疑,因为我在Windows上尝试了上面的测试,而且效果非常好。我的理解错了吗?
- 解决这个问题的最好方法是什么,因为我不会最终改变100个遗留文件。
附加信息:
我的Mac OS X已建立与Mac OS扩展(日志)按照这个链接:
File System Personality: Journaled HFS+
Type (Bundle): hfs
Name (User Visible): Mac OS Extended (Journaled)
Mac OS确实将这两个文件名视为不同的。
<?php
include_once "file.php";
// Prints current file and file.php
print_r(get_included_files());
include_once "file.php";
// Didn't add it more than once
print_r(get_included_files());
include_once "FILE.php";
// Prints current file, file.php and FILE.php
print_r(get_included_files());
你可以看看这里,那里已经有关于这个话题的讨论。
根据我的经验,我会回答:
- 是的,OS X知道这是两个不同的文件。
- os x自带的本机php必须与使用linux或windows的配置不同。我也有这个问题,当移动代码到实时服务器,它停止工作,因为Linux没有找到类"测试"与"测试"。 我认为你是对的。:)
回答我自己的问题:
-
Mac OS X认为这是两个不同的文件吗?
是的。Mac配置为大小写不敏感,但它尊重大小写,所以如果你有两个包含相同的文件,但有混合的大小写,它会给你的文件尊重大小写,好像他们是不同的文件,这导致PHP加载两个文件和第二个包含将是一个类冲突。
-
PHP认为这是两个不同的文件吗?我对此表示怀疑,因为我在Windows上进行了上述测试,效果非常好。
请阅读#1的答案。
-
我理解错了吗?
我的理解是正确的,但它保留了情况。
-
解决这个问题的最好方法是什么,因为我不会最终改变100个遗留文件。
为了避免这种错误,您需要确保同一个文件没有以不同的大小写加载。