Чи чутливі до регістру функції 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.