Чи чутливі до регістру функції PHP?


100

Я копав якийсь код, і я знайшов кілька дзвінків mySQL_fetch_array. Чи чутливий регістр PHP до імен функцій? Я пригадую, що читав це десь, але не можу знайти жодного посилання на нього.


1
Ні, вони, схоже, не є. Переваги, як правило, нижній регістр
— Джейсон,

3
Дублікат stackoverflow.com/questions/2749781 / ... . Ні, функції не залежні від регістру
— Bob Baddeley

Для довідки: він похований тут посередині php.net/manual/en/functions.user-defined.php у блоці Note:.
— Маріо

3
Я голосую за те, щоб залишити це відкритим - заголовок набагато більш загальний і чіткий, тому, ймовірно, можна допомогти більшості людей.
— coreyward

Відповіді:


100

Я цитую це :

Примітка: Імена функцій нечутливі до регістру, хоча це зазвичай хороша форма для виклику функцій так, як вони відображаються в їх декларації.

Таким чином, схоже на те, що визначені користувачем функції не залежать від регістру, було проведено голосування за створення функцій / об'єктів під PHP5, залежно від регістру.


3
PHP5 вже вийшов, ваша єдина надія - PHP6, і я не думаю, що вони б зробили цей крок. Це мало би перешкоджало малому вигоді.
— Марк Томлін

3
@ Марк Томлін Я не згоден. Найкраща практика полягає в тому, щоб підтримувати той самий випадок, що і в посібнику, тому він повинен мало працювати, одночасно збільшуючи чіткість.
— Бен Дофіней

12
Ого. це сумно. хоча ImAgEcReAtEfRoMpNg () є приємним способом
— обдумування

8
Оскільки в цитаті написано "нечутливий до регістру", чому ви говорите "Так виглядає, що визначене користувачем чутливе до регістру"? Якщо це помилка друку, ви дійсно повинні це виправити.
— Вармар

11
Оце Так! Це дійсно приємно з’ясувати через 7 років кодування!
— Даан

34

Немає.

Функції 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
це дійсно погано ... якби я зайшов на свій сайт / myLogInPage / loginsuccess , і подужаю про те , що ти назвав функцією успіху входу, я був би в змозі стерти кілька речей ....
— Цалалака
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.