Заглавные буквы в имени класса PHP

У меня есть два класса в моей системе. Один называется файлом, а второй — файлом. На моем локальном хосте, когда я создаю файл, я получаю объект файла, но мой друг, запускающий тот же скрипт, получает объект файла, как будто заглавные буквы не были распознаны, а «файл» был равен «файлу». Это что-то настраиваемое? Мы оба работаем на Windows. У меня WampServer, у него XAMPP.


person Somal    schedule 10.03.2011    source источник
comment
вы действительно не должны смешивать имена, как это   -  person JamesHalsall    schedule 10.03.2011


Ответы (3)


PHP нечувствителен к регистру для именования классов. это означает, что обычно вы можете выполнять $file = new file(), даже если класс называется File, и наоборот.

Вы случайно не полагаетесь на автоматическую загрузку файлов классов? Если это так, возможно, в зависимости от компьютера интерпретатор не всегда сначала находит один и тот же файл. Это объяснит проблему.

Я настоятельно рекомендую вам переименовать ваши классы. Всегда плохая идея полагаться на регистр, чтобы различать две разные вещи, и по соглашению имена классов всегда начинаются с заглавной буквы.

Если вы не можете изменить имена классов, я предлагаю взглянуть на пространства имен php.

person krtek    schedule 10.03.2011
comment
Но автозагрузчики в файловых системах, чувствительных к регистру, не найдут ваши классы, написанные в другом регистре. - person Vladislav Rastrusny; 18.01.2016
comment
мои уроки не начинаются с заглавных букв ... никогда не было и никогда не будет - person dsdsdsdsd; 29.03.2016
comment
@dsdsdsdsd - Да, зачем соответствовать практически всем стандартам? - person Magnus Eriksson; 25.01.2018

Имена классов в 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
person edorian    schedule 10.03.2011
comment
Это не объясняет, почему он загружает один класс, а его друг — другой с одним и тем же кодом. - person krtek; 10.03.2011
comment
Ты прав. Расширен ответ, чтобы показать, что такой код не должен работать вместе, если в одном сценарии потребуются оба класса (файл и файл). Но с предоставленной информацией я не могу угадать, что он испытывает, просто покажите, что это вообще не должно работать. - person edorian; 10.03.2011
comment
Возможно, если используется загрузчик классов, у вас может быть два файла с одинаковым именем класса внутри, и в зависимости от загрузчика классов это может работать. Но это может привести только к огромным проблемам ;) - person krtek; 10.03.2011

Я предполагаю, что вы используете какую-то ленивую загрузку для файлов классов, возможно, вы программируете в среде PHP. Секрет кроется в вашей функции __autoload. Найди это.

См. руководство по автозагрузке PHP.

Следующий код:

<?php

class file {
    public $a;
}

class File {
    public $a2;
}

$x = new file();

Выдает ошибку: Cannot redeclare class File, так что опять же, проблема может заключаться в том, какой файл включен.

Поведение вашего кода показывает, что один из классов не загружается (в противном случае вы увидите ошибку повторного объявления класса). Вероятно, это автозагрузчик, который сначала загружает класс file, а затем, когда он находит определение для File, он просто предполагает, что он уже загрузил класс (из-за нечувствительного к регистру поведения PHP).

person vbence    schedule 10.03.2011