Przekopałem się przez jakiś kod i znalazłem kilka telefonów mySQL_fetch_array
. Czy w nazwach funkcji w PHP rozróżniana jest wielkość liter? Pamiętam, że gdzieś to czytałem, ale nie mogę znaleźć żadnego odniesienia do tego.
Przekopałem się przez jakiś kod i znalazłem kilka telefonów mySQL_fetch_array
. Czy w nazwach funkcji w PHP rozróżniana jest wielkość liter? Pamiętam, że gdzieś to czytałem, ale nie mogę znaleźć żadnego odniesienia do tego.
Odpowiedzi:
Cytuję z tego :
Uwaga: W nazwach funkcji wielkość liter nie jest rozróżniana, chociaż zwykle jest to dobra forma wywoływania funkcji tak, jak pojawiają się w ich deklaracji.
Wygląda więc na to, że w funkcjach zdefiniowanych przez użytkownika nie jest rozróżniana wielkość liter. Głosowano za tym, aby w funkcjach / obiektach PHP5 rozróżniać wielkość liter.
TL; DR: w nazwach klas wielkość liter nie jest rozróżniana, ale zawsze używaj tej samej wielkości, co w deklaracji (tak samo jak w przypadku funkcji). Ponadto tworzenie instancji klas z różnymi wielkościami liter, tak jak zostały zdefiniowane, może powodować problemy z autoloaderami.
W nazwach klas wielkość liter nie jest rozróżniana:
<?php
class SomeThing {
public $x = 'foo';
}
$a = new SomeThing();
$b = new something();
$c = new sOmEtHING();
var_dump($a, $b, $c);
To daje:
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"
}
Problem polega na używaniu autoloaderów i systemów plików z rozróżnianiem wielkości liter (takich jak ext2 / 3/4), w którym musisz wywołać nazwę klasy w tym samym przypadku, gdy nazwany jest plik zawierający klasę (a nie jak nazwa klasy jest faktycznie pisana wielkością liter), lub użyj strtolower
:
Plik klasy:
<?php
// filename something.php
class SomeThing {
...
}
Funkcja autoloadera ( __autoload
lub funkcja do rejestracji spl_autoload_register
)
function my_autloader($className) {
$filename = CLASSES_DIR . DIRECTORY_SEPARATOR . $className . '.php';
if (file_exists($filename)) {
require($filename);
}
}
Teraz z tym kodem:
$a = new something(); // works
$b = new SomeThing(); // does not work
$c = new SOMETHING(); // does not work
Możesz sprawić, że to zadziała (tj. Efektywnie nie rozróżniając wielkości liter w nazwach klas za pomocą autoloadera), jeśli dodałeś wywołanie do strtolower()
w kodzie autoloadera, ale tak jak w przypadku funkcji, lepiej jest odwoływać się do klasy w ten sam sposób, w jaki jest zadeklarowana, mieć nazwę pliku z taką samą wielkością jak nazwa klasy, używać autoloaderów i zapomnieć o używaniu strtolower
i lubianych.
W PHP zmienne rozróżniają wielkość liter, ale funkcje nie mają takiego problemu. Możesz użyć następujących instrukcji do wyświetlania danych wyjściowych, wszystkie pokażą ten sam wynik.
<?php
Echo "This is a test script";
ECHO "This is a test script";
echo "This is a test script";
?>
Z drugiej strony, jeśli zmienisz wrażliwość zmiennych na wielkość liter, to pokaże błąd.
Przykład:
<?php
$a=5;
echo $A;// It will show the error.
?>
Wynik:
Notice: Undefined variable: A in C:\xampp\htdocs\test.php on line 3
W nazwach metod również wielkość liter nie jest rozróżniana. na przykład:-
<?php
class C {
public function method() { }
public function METHOD() { }
}
wynik:
PHP Fatal error: Cannot redeclare C::METHOD() in ....php on line 6
Podsumowując odpowiedź wszystkich. Mimo że PHP nie wymaga spójności wielkości liter we wszystkich wystąpieniach, nawet do tej pory w PHP5.
Najlepsza praktyka będzie
zawsze używaj tych samych przypadków, gdy odwołujesz się do zmiennych („obowiązkowe”) lub funkcji („opcjonalnych, ale zalecane).
Nigdy nie wiesz, że może któregoś dnia głosowanie się zakończy i uratujesz cały koszmar zmieniających się przypadków w twoich aplikacjach wykonanych kilka lat temu, które wymagają aktualizacji w PHP.
Mam nadzieję, że i tak pomoże.
Może to już za późno, ale ...
Każdy już tu wiedział: silnik PHP nie dba o wielkość liter.
I jest głosowanie na bugtrackerze PHP, gdzie większość mówi: „Tak, jestem zwolennikiem rozpoznawania wielkości liter”.
Ale jestem przeciwna, ponieważ w moim frameworku MVC wywołuję akcję kontrolera:
$currentController = new $controller($parameters);
$currentAction = $currentController->{$action}();
Kontrolery $ controller i $ action są pobierane z adresu URL bez zmian.
Pomyśl, jeśli użytkownik opublikuje link do mojej witryny: https: // my-site / MyPartnerController / MyPartnerGallery
podczas gdy klasa nosi nazwę myPartnerController ...
Oznacza to, że nikt nigdy nie uzyska tej strony, jeśli nazwy klas i funkcji PHP uwzględniają wielkość liter.
Tak, zawsze używam wszystkich nazw w kodzie zgodnie z deklaracją. Ale modlę się, aby nigdy nie rozróżniali wielkości liter w nazwach funkcji i klas.
Dziękuję Ci!