Interpreter PHP, poza oczywistą funkcjonalnością dotyczącą wykonywania napisanego przez nas kodu posiada kilka innych ciekawych możliwości. Jedną z nich jest wykonywanie fragmentu kodu przekazanego bezpośrednio jako parametr wywołania. W dzisiejszym wpisie chciałbym pokazać jeden z problemów, na jaki można w tym przypadku natrafić.
PHP: Przełącznik „-r”.
Aby uruchomić wspomnianą funkcjonalność, należy wywołać interpreter PHP z przełącznikiem „-r”, po którym należy przekazać parametr zawierający żądany przez nas kod. Weźmy pod uwagę przykładowe wywołanie:
php -r ""
Ta linijka, po przetworzeniu przez interpreter wykona… nic. ;] Weźmy więc pod uwagę coś bardziej ambitnego:
php -r "echo 2;" php -r "echo \"something\"" php -r "\$sth = 2.5; echo \$sth;"
I wyniki:
2 something 2.5
Widać tu zarówno wypisanie na ekran wartości liczbowej, stringa, jak i wartości zmiennej. Kilka rzeczy, o których należy pamiętać:
- Ze względu na charakterystykę linii komend, należy escape’ować znak cudzysłowu (podwójny ciapek) lub stosować apostrofy (pojedynczy ciapek).
- Znak dolara jest znakiem specjalnym, a więc także wstawiamy backslash przed każdym jego wystąpieniem. Jest to nieco uciążliwe w przypadku PHP
, ale nic na to nie poradzimy– wystarczy zamiast cudzysłowów, ograniczyć kod apostrofami. - Do interpretera można przekazać więcej niż jedną instrukcję, wystarczy je po prostu oddzielić znakiem średnika.
Skoro mamy już podstawy, przejdźmy do opisania wspomnianego na początku problemu.
PHP: Błąd „Parse error, unexpected ‘<’ in Command line code on line n”.
Absolutną podstawą pisania skryptów PHP jest umieszczenie znacznika początku skryptu na… jego początku. Za używanie short open tagów skazywałbym na ciężkie roboty, a więc każdy skrypt powinien zaczynać się od fragmentu:
<?php
Na pewno zauważyliście, że w przypadku przykładowych linijek wywołanych na początku tego wpisu nigdzie rzeczony „open tag” nie został umieszczony, a więc prawdopodobnie postąpilibyście w ten sam sposób. Zakładam jednak, że każdy, kto trafi na niniejszy artykuł, prawdopodobnie tego nie wie i zrobi dokładnie tak, jak go uczono – wstawi znacznik <?php na początku parametru zawartego w cudzysłowach.
Zobaczmy więc, co się stanie, jeśli wpiszemy w konsolę przykładowe wywołanie:
php -r "<?php echo \"3.45\";"
Wynik:
Parse error: syntax error, unexpected '<' in Command line code on line 1
Jak mówi manual PHP dla przełącznika „-r”:
-r <code> Run PHP <code> without using script tags <?..?>
A więc jasnym jest, iż tag otwierający nie może rozpoczynać przekazanej linijki kodu. Może jednak być użyty w jej środku, najpierw tag zamykający, a potem otwierający:
php -r "echo \"3.45\" ?>asd<?php echo 2;" // result: 3.45asd2
Także jak zwykle możemy „kombinować”, stosując różne pomysły i testując, czy będzie działać. Ciekaw jestem, jakie wymyślne konstrukcje przyszły Wam do głowy podczas lektury tego artykułu. Może podzielicie się nimi w komentarzach?
Warto przeczytać.
Trwa ładowanie…