Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PHP, Perl, Python Новый топик    Ответить
 (php 6) Функция [class_exists("...", false)] проверяет класс без учёта регистра  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1213
Рассмотрим две ситуации:
1. Веб-сервер развёрнут в ОС семейства Windows
2. Веб-сервер развёрнут на виртуальной машине с ОС Debian, но файлы проекта Debian монтирует как сетевую файловую систему smb из хост-машины с ОС Windows (т.е. файлы физически расположены на хост-машине Windows, а гостевая машина Debian работает с ними как с локальными)

В обоих этих ситуациях файловые функции и директивы file_exists, include и пр. будут выполняться в регистронезависимом режиме. Здесь всё понятно.

Не понятно, почему и функция class_exists("class", false) тоже работает в регистронезависимом режиме ? Бред какой-то. Ведь эта функция (если 2-й параметр равен false) файлы не читает, а проверяет, загружен/интерпетирован ли указанный класс в оперативной памяти. А в оперативной памяти имя класса одно. Со вполне определённым регистром. И если этой функции передать имя класса с некорректным регистром, она должна вернуть false, а возвращает true. Не вижу логики...
4 окт 17, 20:46    [20843550]     Ответить | Цитировать Сообщить модератору
 Re: (php 6) Функция [class_exists("...", false)] проверяет класс без учёта регистра  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1213
Тьфу, в заголовке "php 6" указал. Имел ввиду "php 5.6".
4 окт 17, 20:48    [20843565]     Ответить | Цитировать Сообщить модератору
 Re: (php 6) Функция [class_exists("...", false)] проверяет класс без учёта регистра  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1213
автор
Ведь эта функция (если 2-й параметр равен false) файлы не читает, а проверяет, загружен/интерпетирован ли указанный класс в оперативной памяти. А в оперативной памяти имя класса одно. Со вполне определённым регистром.
А именно то, которое указано в подключенном файле
4 окт 17, 20:50    [20843576]     Ответить | Цитировать Сообщить модератору
 Re: (php 6) Функция [class_exists("...", false)] проверяет класс без учёта регистра  [new]
vkle
Member

Откуда: Самара
Сообщений: 13565
Нет там никакой регистрозависимости.
$ php -r 'class a {} class A {}'
PHP Fatal error:  Cannot redeclare class A in Command line code on line 1
4 окт 17, 21:08    [20843609]     Ответить | Цитировать Сообщить модератору
 Re: (php 6) Функция [class_exists("...", false)] проверяет класс без учёта регистра  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1213
автор
Нет там никакой регистрозависимости
А должна быть
4 окт 17, 21:15    [20843626]     Ответить | Цитировать Сообщить модератору
 Re: (php 6) Функция [class_exists("...", false)] проверяет класс без учёта регистра  [new]
vkle
Member

Откуда: Самара
Сообщений: 13565
А где об этом написано в документации?
С именами функций, кстати, такая же ситуевина.
4 окт 17, 21:18    [20843635]     Ответить | Цитировать Сообщить модератору
 Re: (php 6) Функция [class_exists("...", false)] проверяет класс без учёта регистра  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1213
автор
А где об этом написано в документации?
В документации многих нюансов не пишут. Логически должны быть регистрозависимыми, как имена файлов, сравнение строк и пр.
Сегодня полдня потратил из-за того, что в двух классах точки останова не работали. Как оказалось, эти файлы подключались с неверным регистром. При этом подключались без ошибок и предупреждений - для php/xdebug это были другие файлы, а не те, в которых фактически устанавливались точки останова...
4 окт 17, 22:18    [20843823]     Ответить | Цитировать Сообщить модератору
 Re: (php 6) Функция [class_exists("...", false)] проверяет класс без учёта регистра  [new]
vkle
Member

Откуда: Самара
Сообщений: 13565
Да ну как сказать... Вижу только один способ - не уповать на регистр имен файлов и, давая имена, представлять, что "на винде должно работать". В никсах имеется зависимость от регистра. В винде имена файлов регистронезависимы, да ещё и символ ":" запрещен. И ничего, живут как-то, пользуясь одной и той же ФС на сервере. Без разницы, на каком, кстати. :)

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

К вопросу о нюансах. Про регистрозависимость имен переменных, например, буквально в первой строчке написано http://php.net/manual/ru/language.variables.basics.php
Про имена констант - тоже http://php.net/manual/ru/language.constants.php

Имена файлов к этим нюансам языка программирования вообще никакого отношения не имеют. Ими файловая система занимается, а не пхп.

А вот почему разработчики применили разный подход к именам функций/классов и переменных/констант - вот эту вот логики совсем не понятно. На мой взгляд, лучше б одинаково было.
5 окт 17, 01:44    [20844069]     Ответить | Цитировать Сообщить модератору
 Re: (php 6) Функция [class_exists("...", false)] проверяет класс без учёта регистра  [new]
Barlone
Member

Откуда:
Сообщений: 873
vkle
А где об этом написано в документации?
С именами функций, кстати, такая же ситуевина.
Про функции то написано
Note: Function names are case-insensitive, though it is usually good form to call functions as they appear in their declaration.
5 окт 17, 09:55    [20844287]     Ответить | Цитировать Сообщить модератору
 Re: (php 6) Функция [class_exists("...", false)] проверяет класс без учёта регистра  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1213
автор
Да ну как сказать... Вижу только один способ - не уповать на регистр имен файлов и, давая имена, представлять, что "на винде должно работать".
автор
А вот почему разработчики применили разный подход к именам функций/классов и переменных/констант - вот эту вот логики совсем не понятно. На мой взгляд, лучше б одинаково было.
В IDE у меня в настройках задано слежение за корректностью регистра при написании имён классов и функций/методов. Но классы у меня подключаются через автозагрузчик, а имена необходимых классов формируются другим методом - здесь и была неприметная ошибка с регистром. Если бы имена классов были регистрозависимыми, то класс с некорректным регистром так же бы успешно подключался, но при первом явном использовании класса с корректным регистром (например, вызов статики) была бы сгенерирована ошибка. Правда, при отсутствии в коде явного упоминания класса ошибка по-прежнему осталась бы незамеченной.

Сейчас в автозагрузчике классов после успешного подключения файла добавил проверку:
in_array($className, get_declared_classes())
5 окт 17, 14:30    [20845473]     Ответить | Цитировать Сообщить модератору
 Re: (php 6) Функция [class_exists("...", false)] проверяет класс без учёта регистра  [new]
Няшик
Member

Откуда: Екатеринбург
Сообщений: 728
http://php.net/manual/ru/function.class-exists.php


Список параметров ¶

class_name

Имя класса. Воспринимается без учета регистра.
autoload

Вызывать ли по умолчанию __autoload.
8 окт 17, 18:44    [20852651]     Ответить | Цитировать Сообщить модератору
 Re: (php 6) Функция [class_exists("...", false)] проверяет класс без учёта регистра  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1213
автор
Имя класса. Воспринимается без учета регистра.
Да. В справке указано. Только никто внимания не обратил.
Но в любом случае это не особенность работы конкретной функции, а общая особенность работы php с классами (как показал vkle)
8 окт 17, 23:31    [20853176]     Ответить | Цитировать Сообщить модератору
Все форумы / PHP, Perl, Python Ответить