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?