类名中的大写字母 PHP

25

我的系统里有两个类。一个叫file,另一个叫File。 在我的本地主机上创建file类的实例会得到file对象,但是我的朋友运行同样的脚本时却得到了File对象,好像大写字母没有被识别,"file"被等同于"File"。 这是可配置的吗? 我们都在Windows上运行。我用的是WampServer,他用的是XAMPP。


13
你真的不应该混淆那样的名字。 - JamesHalsall
3个回答

58

PHP中的类命名不区分大小写。这意味着,即使类被命名为File,你仍然可以正常执行$file = new file(),反之亦然。

你是否依赖于自动加载类文件?如果是这种情况,可能会出现解释器在不同计算机上不能总是首先找到相同的文件。这将解释问题所在。

我强烈建议你重新命名你的类。依靠大小写来区分两个不同的东西总是一个坏主意,而按照惯例,类名始终以大写字母开头。

如果无法更改类名,建议查看php namespaces


2
但是在区分大小写的文件系统上,自动加载程序将无法找到拼写不同大小写的类。 - Vladislav Rastrusny
我的类名不以大写字母开头...从来没有,也永远不会。 - dsdsdsdsd
7
为什么要遵守基本上所有标准? - M. Eriksson

18

在 PHP 中,类名不区分大小写(这与操作系统无关)。

class myclass {}

$x = new MYclaSS;

var_dump($x);

object(myclass)#1 (0) {
}

作为一般建议:你不应该开始并尝试混合那里的东西 :)

像这样的代码不应该能工作:

class ab {}

class AB {}

Fatal error: Cannot redeclare class AB in ... on line x

这并没有解释为什么他正在使用相同的代码加载一个类,而他的朋友又在加载另一个类。 - krtek
你说得对。我扩展了答案,以表明如果在一个脚本中同时需要“file”和“File”类,则这样的代码不应该完全起作用。但是根据提供的信息,我无法猜测他正在经历什么,只能说明它根本不应该工作。 - edorian
如果使用类加载器,可以有两个同名的文件,并且根据类加载器的不同,它们可以工作。但这可能会导致巨大的问题 ;) - krtek

2

我猜你正在使用某种类文件的惰性加载,可能是在PHP框架中编程。秘密将在你的__autoload函数中。找到它。

查看PHP手册中的自动加载

以下代码:

<?php

class file {
    public $a;
}

class File {
    public $a2;
}

$x = new file();

产生错误:Cannot redeclare class File,所以秘诀可能就在于哪个文件被包含了。
您的代码行为表明其中一个类没有被加载(否则您会看到类重新声明错误)。这可能是自动加载程序首先加载file类,然后当它发现定义File时,它仅仅认为已经加载了该类(由于PHP的不区分大小写的行为)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接