Чувствительны ли функции PHP к регистру?


101

Я копался в коде и нашел несколько обращений к mySQL_fetch_array. Учитывает ли PHP регистр имен функций? Я помню, как читал это где-то, но, похоже, не нашел на него ссылки.


1
Нет, похоже, не так. предпочтение обычно нижний регистр
Джейсон

3
Дубликат stackoverflow.com/questions/2749781/… . Нет, функции не чувствительны к регистру
Боб Баддели

Для справки: он похоронен здесь, посередине php.net/manual/en/functions.user-defined.php в блоке Note : .
Марио

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

Ответы:


100

Я цитирую это :

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

Таким образом, похоже, что пользовательские функции не чувствительны к регистру, было голосование за создание функций / объектов в PHP5 с учетом регистра.


3
PHP5 уже вышел, ваша единственная надежда - это PHP6, и я не думаю, что они пойдут на этот шаг. Это было бы слишком много для небольшой выгоды.
Марк Томлин

3
@Mark Tomlin Я не согласен. Лучше всего сохранить тот же футляр, что и в руководстве, чтобы он не ломался, но при этом повышал ясность.
Бен Дофини

12
Вот это да. это печально. хотя ImAgEcReAtEfRoMpNg () - хороший способ
запутать

8
Поскольку в цитате говорится «без учета регистра», почему вы говорите: «Похоже, что пользовательский ввод с учетом регистра»? Если это опечатка, вам действительно стоит ее исправить.
Barmar

11
Вот Это Да! Это действительно приятно узнать после 7 лет программирования!
Даан

35

Нет.

Функции PHP не чувствительны к регистру.


19

TL; DR: имена классов нечувствительны к регистру, но всегда используют тот же регистр, что и в объявлении (так же, как и с функциями). Кроме того, создание экземпляров классов с другим регистром, как они были определены, может вызвать проблемы с автозагрузчиками.


Также имена классов нечувствительны к регистру:

<?php
class SomeThing {
  public $x = 'foo';
}

$a = new SomeThing();
$b = new something();
$c = new sOmEtHING();
var_dump($a, $b, $c);

Это выводит:

class SomeThing#1 (1) {
  public $x =>
  string(3) "foo"
}
class SomeThing#2 (1) {
  public $x =>
  string(3) "foo"
}
class SomeThing#3 (1) {
  public $x =>
  string(3) "foo"
}

Проблема заключается в использовании автозагрузчиков и файловых систем с учетом регистра (например, ext2 / 3/4), поскольку вы должны вызывать имя класса с тем же регистром, что и файл, содержащий класс (а не то, как имя класса фактически имеет регистр), или используйте strtolower :

Файл класса:

<?php
// filename something.php
class SomeThing {
   ...
}

Функция автозагрузчика ( __autoloadили функция для регистрации spl_autoload_register)

function my_autloader($className) {
  $filename = CLASSES_DIR . DIRECTORY_SEPARATOR . $className . '.php';
  if (file_exists($filename)) {
    require($filename);
  }
}

Теперь с этим кодом:

$a = new something(); // works
$b = new SomeThing(); // does not work
$c = new SOMETHING(); // does not work

Вы можете выполнить эту работу (т.е. иметь эффективно нечувствительные к регистру имена классов с помощью автозагрузчика), если вы добавили вызов strtolower()в код автозагрузчика, но, как и в случае с функциями, просто лучше ссылаться на класс так же, как он объявлен, иметь имя файла в том же регистре, что и имя класса, использовать автозагрузчики и забыть об использовании strtolowerи т.п.


7

Нет, они не чувствительны к регистру, однако вы всегда должны использовать регистр, указанный в руководстве, для единообразия.

Однако переменные являются чувствительны к регистру.


3

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

<?php
Echo "This is a test script";
ECHO "This is a test script";
echo "This is a test script";
?>

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

Пример:

<?php
$a=5;
echo $A;// It will show the error.
?>

Вывод:

Notice: Undefined variable: A in C:\xampp\htdocs\test.php on line 3

2

И имена методов также нечувствительны к регистру. например:-

<?php
       class C { 

           public function method() { } 

           public function METHOD() { } 
       }

вывод:

PHP Fatal error:  Cannot redeclare C::METHOD() in ....php on line 6

1

В заключение каждого ответа. Несмотря на то, что PHP не требует согласованности регистра символов во всех случаях, даже до сих пор в PHP5.

Лучшая практика будет

всегда используйте одни и те же случаи, когда ссылаетесь на переменные (обязательные) или функции (необязательные, но рекомендуемые).

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

Надеюсь, это все равно поможет.


Повторно «спасти весь кошмар смены регистра»: Нет, я так понимаю, что если изменение когда-либо будет сделано, чувствительность к регистру будет вариантом, установленным в php.ini. Таким образом сохраняется обратная совместимость.
ToolmakerSteve

-2

Может быть, уже поздно, но ...

Здесь все уже знают: PHP-движок не заботится о регистре букв.

И есть голосование по отслеживанию ошибок PHP, где большинство говорит: «Да, я за сенситивность».

Но я против, потому что в моем фреймворке MVC я вызываю действие контроллера:

    $currentController = new $controller($parameters);
    $currentAction = $currentController->{$action}();

$ controller и $ action берутся из URL как есть.

Подумайте, если пользователь публикует ссылку на мой сайт: https: // my-site / MyPartnerController / MyPartnerGallery

а класс называется myPartnerController ...

Это означает, что никто никогда не получит эту страницу, если имена классов и функций PHP чувствительны к регистру.

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

Спасибо!


1
это действительно плохо ... если бы я пошел на my-site / myLogInPage / loginsuccess и сделал несколько предположений о том, что вы назвали своей функцией успешного входа в систему, я бы оказался в состоянии или смог бы стереть некоторые вещи ...
Tschallacka
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.