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

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

Ответ 1

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

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

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

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

Ответ 2

Классные имена в 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

Ответ 3

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

Отметьте Руководство по автоматической загрузке PHP.

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

<?php

class file {
    public $a;
}

class File {
    public $a2;
}

$x = new file();

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

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