Я копав якийсь код, і я знайшов кілька дзвінків mySQL_fetch_array
. Чи чутливий регістр PHP до імен функцій? Я пригадую, що читав це десь, але не можу знайти жодного посилання на нього.
Я копав якийсь код, і я знайшов кілька дзвінків mySQL_fetch_array
. Чи чутливий регістр PHP до імен функцій? Я пригадую, що читав це десь, але не можу знайти жодного посилання на нього.
Відповіді:
Я цитую це :
Примітка: Імена функцій нечутливі до регістру, хоча це зазвичай хороша форма для виклику функцій так, як вони відображаються в їх декларації.
Таким чином, схоже на те, що визначені користувачем функції не залежать від регістру, було проведено голосування за створення функцій / об'єктів під PHP5, залежно від регістру.
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
та лайки.
У 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
І назви методів також нечутливі до регістру. наприклад: -
<?php
class C {
public function method() { }
public function METHOD() { }
}
вихід:
PHP Fatal error: Cannot redeclare C::METHOD() in ....php on line 6
На закінчення відповіді кожного. Навіть незважаючи на те, що PHP не вимагає послідовності символів у всіх випадках, навіть досі в PHP5.
Найкраща практика буде
завжди використовуйте одні й ті ж випадки, коли повертаєтесь до змінних (її "обов'язкових") або до функцій ("необов'язково", але рекомендується).
Ніколи не знаєш, що, можливо, одного дня пройде голосування, і ти збережеш цілий кошмар зміни справ у своїх програмах, зроблених пару років тому, які потребують оновлення в PHP.
Сподіваюся, це допоможе в будь-якому випадку.
Можливо, це вже пізно, але ...
Тут уже всі знають: PHP-движок не піклується про букви букв.
І відбувається голосування за винищувач PHP, де більшість каже: "Так, я про чутливість до випадків".
Але я проти, тому що в рамках MVC я називаю дії контролера:
$currentController = new $controller($parameters);
$currentAction = $currentController->{$action}();
$ controller та $ action беруться з URL як є.
Подумайте, якщо користувач опублікує посилання на мій сайт: https: // my-site / MyPartnerController / MyPartnerGallery
а клас названий myPartnerController ...
Це означає, що ніхто ніколи не отримує цю сторінку, якщо назви класів і функцій PHP залежать від регістру.
Так, я завжди використовую всі імена в коді, як оголошено. Але я молюсь, щоб вони ніколи не змінювали регістри назв функцій та класів.
Дякую!