2

这是我的课堂脚本:

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 致命错误:无法在第 2 行的 /private/var/www/temp/ClaSs.php 中重新声明类测试

*Nix OS 支持不区分大小写的文件系统,这意味着它理解用于引用文件名的大小写。话虽如此,上面的脚本正在加载相同的文件,而 Mac 或 PHP 认为它是一个不同的文件并在运行时加载它,这会导致上述错误。

我的问题:

  1. Mac OS X 是否认为这是两个不同的文件?
  2. PHP是否认为这是两个不同的文件?我怀疑是因为我在 Windows 上尝试了上述测试,它就像一个魅力。
  3. 我的理解错了吗?
  4. 解决此问题的最佳方法是什么,因为我最终不会更改 100 多个旧文件。

附加信息:

根据此链接,我的 Mac OS X 已使用 Mac OS Extended (Journaled) 构建:

File System Personality:  Journaled HFS+
Type (Bundle):            hfs
Name (User Visible):      Mac OS Extended (Journaled)
4

3 回答 3

1

你可以看看这里已经有关于该主题的讨论。

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

  1. 是的,OS X 知道它是 2 个不同的文件。
  2. os x 自带的原生 php 的配置必须与使用 linux 或 windows 不同。当将代码移动到实时服务器时,我也遇到了这个问题,它停止工作,因为 Linux 没有找到“Testing”与“TEsting”类。
  3. 我想你是对的。:)
于 2013-06-18T10:59:25.250 回答
1

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());
于 2013-06-18T11:01:03.423 回答
0

回答我自己的问题:

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

    是的。Mac 配置为不区分大小写,但它尊重大小写,因此,如果您对同一文件有两个包含但混合大小写,它将为您提供尊重大小写的文件,就好像它们是不同的文件一样,这会导致 PHP 加载这两个文件和第二个包含将是类冲突。

  2. PHP是否认为这是两个不同的文件?我怀疑是因为我在 Windows 上尝试了上述测试,它就像一个魅力。

    请阅读#1的答案。

  3. 我的理解错了吗?

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

  4. 解决此问题的最佳方法是什么,因为我最终不会更改 100 多个旧文件。

    为避免此类错误,您需要确保不会以不同的大小写加载相同的文件。

于 2013-07-15T07:56:28.423 回答