Я копался в коде и нашел несколько обращений к 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 чувствительны к регистру.
Да, я всегда использую все имена в коде, как заявлено. Но я молюсь, чтобы они никогда не делали имена функций и классов чувствительными к регистру.
Спасибо!