Почему функции и методы в PHP нечувствительны к регистру?


107

Функции и методы в PHP нечувствительны к регистру, как показано в следующем примере.

function ag()
{
    echo '2';
}

Ag();
class test {
    function clMe()
    {
        echo 'hi';
    }
}

$instance = new test;
$instance->clme();

Но с переменными дело обстоит иначе. В чем обоснование?


161
PHP не нуждается в вонючих объяснениях!
Макс Шавабке

2
«Потому что так говорит продавец супа». Без объяснения, но ссылки: php.net/manual/en/functions.user-defined.php (между примерами 3 и 4), php.net/manual/en/language.variables.basics.php
outis

2
class Share{ share($str){ echo $str; } } $sh = new Share(); $sh->share("string");Вы можете быть удивлены, увидев два вызова функции share ($ str). первый из-за c'tor и второй явный вызов по тем же причинам !!
vivek.m

1
@outis, что ты имеешь в виду под "супом"?
Pacerier

1
@outis, вы имеете в виду «Суп нацистов» из Сайнфельда. YouTube , Википедия
Кевин Траас 08

Ответы:


98

Позвольте мне процитировать интервью - создатель PHP Расмус Лердорф

Первая версия PHP была простым набором инструментов, которые я собрал для своего веб-сайта и для пары проектов. Один инструмент выполнял причудливую регистрацию обращений в базу данных mSQL, другой действовал как интерпретатор данных формы. В итоге у меня было около 30 разных маленьких программ CGI, написанных на C, прежде чем мне это надоело, и я объединил их все в одну библиотеку C. Затем я написал очень простой парсер, который выбирал теги из файлов HTML и заменял их выводом соответствующих функций в библиотеке C.

Простой синтаксический анализатор постепенно разросся, включив в него условные теги, затем теги цикла, функции и т. Д. Я никогда не думал, что пишу язык сценариев. Я просто добавил немного функциональности в синтаксический анализатор замены макросов. Я все еще писал всю свою настоящую бизнес-логику на C.

Я где-то читал, что, поскольку все представленные функции по существу ощущались как теги в документе HTML, и поскольку теги HTML не учитывали регистр, он выбрал имена функций в PHP так, чтобы регистр не учитывался. Позже эта функция осталась в языке.


66
Я также помню цитату Расмуса на конференции PHP в Париже, в которой говорилось более или менее: «Я определенно не очень хороший программист с точки зрения соблюдения строгих правил или стандартов кодирования, но я могу сказать, что если вы полагаетесь на чувствительность к регистру отличить одно имя функции от другого, у вас серьезные проблемы! "
Tom Desp 05

1
будет ли он по-прежнему нечувствителен к регистру в будущем?
vee

4
Вот почему программисты php используют подчеркивание вместо верблюжьего регистра при именовании своих функций.
paperstreet7

2
@ paperstreet7 Некоторые знают. Хорошие - нет. По крайней мере, больше нет.
Дэн

13
@dan, многие "хорошие" программисты используют символы подчеркивания. Фактически, PSR-0 намеренно не дает рекомендаций. Хороший программист выбирает символы подчеркивания или верблюжий регистр и придерживается этого соглашения. Довольно глупо делать этот выбор мерой того, является ли кто-то хорошим программистом.
jdp

34

Да, имена функций и методов не чувствительны к регистру.

И да, имена переменных чувствительны к регистру.

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



Для справки несколько ссылок / цитат на разные страницы руководства:

Для функций ( цитирование ) :

Примечание. Имена функций не чувствительны к регистру, хотя обычно рекомендуется вызывать функции в том виде, в котором они указаны в их объявлении.

А методы - это не более чем функции в объектах - особенно когда мы думаем о PHP 4 и обратной совместимости.


А для переменных ( цитирование ):

Переменные в PHP представлены знаком доллара, за которым следует имя переменной. Имя переменной чувствительно к регистру.

А свойства объекта - это не что иное, как переменные в объектах - то же замечание о PHP 4 и обратной совместимости.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.