Mac OS X + PHP:不能重新声明类测试


Mac OS X + PHP: Cannot redeclare class testing

下面是我的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上尝试了上面的测试,而且效果非常好。我的理解错了吗?
  1. 解决这个问题的最好方法是什么,因为我不会最终改变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());

你可以看看这里,那里已经有关于这个话题的讨论。

根据我的经验,我会回答:

  1. 是的,OS X知道这是两个不同的文件。
  2. os x自带的本机php必须与使用linux或windows的配置不同。我也有这个问题,当移动代码到实时服务器,它停止工作,因为Linux没有找到类"测试"与"测试"。
  3. 我认为你是对的。:)

回答我自己的问题:

  1. Mac OS X认为这是两个不同的文件吗?

    是的。Mac配置为大小写不敏感,但它尊重大小写,所以如果你有两个包含相同的文件,但有混合的大小写,它会给你的文件尊重大小写,好像他们是不同的文件,这导致PHP加载两个文件和第二个包含将是一个类冲突。

  2. PHP认为这是两个不同的文件吗?我对此表示怀疑,因为我在Windows上进行了上述测试,效果非常好。

    请阅读#1的答案。

  3. 我理解错了吗?

    我的理解是正确的,但它保留了情况。

  4. 解决这个问题的最好方法是什么,因为我不会最终改变100个遗留文件。

    为了避免这种错误,您需要确保同一个文件没有以不同的大小写加载。