Każdego programistę w życiu spotykają chwile doszukiwania się logiki lub chwile zwątpienia w zasady matematyki. Język PHP w znaczącym stopniu ułatwia zaistnienie takiej sytuacji.
Wyobraźmy sobie, potrzebę napisania klasy umożliwiającej stronicowanie wyników. Metoda calculate służy do policzenia dolnego zakresu wyników (strona 5, wyniki 51-60). Całość wygląda następująco:
class Pager
{
private
$page = 1,
$per_page = 10;
public function calculate()
{
return $this->page * $this->per_page - $this-per_page + 1;
}
}
Jedna mała pomyłka. Zamiast
$this->per_page
do kodu wkradło się:
$this-per_page
Co to zmienia? Na pierwszy rzut oka parser PHP powinien poinformować o błędzie… jednak linia kodu zawierająca błąd interpretowana jest następująco:
$this->page // 1
$this->per_page // 10
$this // rzutowane na int to 1, bo obiekt istnieje
per_page // jako stała niezdefiniowana to 0
Wykonywane działanie matematyczne wygląda zatem następująco:
1 * 10 - 1 - 0 + 1
Wynik działania to o dziwo 10… Dlatego kocham PHP!
Dawno w PHP nie pisałem, ale założę się że po ustawieniu wyświetlania wszystkich ostrzeżeń (co jest podstawą jeśli chce się cokolwiek w PHP napisać) takowe się w tej sytuacji pojawi, mylę się ?
Słuszna uwaga. Po włączeniu błędów:
error_reporting(E_ALL);
Otrzymałem:
Notice: Object of class Pager could not be converted to int in /home/drymek/test.php on line 12
Notice: Use of undefined constant per_page – assumed ‘per_page’ in /home/drymek/test.php on line 12
Klasa była używana w symfony, zatem najbardziej prawdopodobne jest to, ze omyłkowo wyszedłem ze środowiska dev. Ot taki zbieg okoliczności niemożliwy w większości innych języków programowania.
Jakoś mnie to nie zaskakuje ;)