2011-03-10 149 views
18

我在我的系统中有两个类。一个叫做文件,第二个是文件。 在我的本地主机上,当我实例化文件我得到文件对象,但我的朋友运行相同的脚本获取文件的对象像大写字母无法识别和“文件”等于“文件”。 这是一些可配置的东西?我们都在Windows上运行。我有WampServer,他有XAMPP。类名中的大写字母PHP

+11

你真的不应该混合这样的名字 – JamesHalsall 2011-03-10 13:21:19

回答

14

类名在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 
+0

这并不能解释他为什么要用同样的代码加载一个类和他的另一个朋友。 – krtek 2011-03-10 13:27:05

+0

你是对的。扩展答案以显示如果在一个脚本中需要两个类(“file”和“File”),那么这样的代码不应该一起工作。但是提供的信息我无法猜测他正在体验什么,只是表明它根本不应该工作 – edorian 2011-03-10 13:33:18

+0

如果使用类加载器,则可以使用两个具有相同类名的文件,取决于类加载器,它可以工作。但是这只能导致巨大的问题;) – krtek 2011-03-10 13:42:11

41

PHP是区分该类命名不敏感。这意味着即使您的课程名称为File,反之亦然,您通常也可以执行$file = new file()

你是否依靠自动加载类文件?如果是这种情况,根据计算机的不同,解释器并不总是先找到相同的文件。这将解释这个问题。

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

如果你不能改变类名,我建议看看php namespaces

+1

但是区分大小写的文件系统上的自动加载器不会在不同的情况下找到您拼写的类。 – 2016-01-18 14:06:18

+0

我的课程不以大写字母开头...从来没有,永远不会开始 – dsdsdsdsd 2016-03-29 02:06:00

+1

@dsdsdsdsd - Y,为什么基本符合所有标准? – 2018-01-25 05:52:40

1

我猜你正在使用某种懒加载作为类文件,可能是你在编写PHP框架。秘密在于你的__autoload功能。找到它。

检查PHP manual for Autoloading

下面的代码:

<?php 

class file { 
    public $a; 
} 

class File { 
    public $a2; 
} 

$x = new file(); 

给出了一个错误:Cannot redeclare class File如此反复,关键可能是哪个文件是包括

你的代码的行为显示其中一个类没有被加载(否则你会看到类的redeclare错误)。它可能是首先加载file类的自动加载器,然后当它发现定义为File时,它只是假定它已经加载了该类(由于PHP的大小写不敏感行为)。