This post comes from the first version of this blog.
Please send me an email if anything needs an update. Thanks!

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:
1
php -r ""

Ta linijka, po przetworzeniu przez interpreter wykona… nic. ;] Weźmy więc pod uwagę coś bardziej ambitnego:

1
2
3
php -r "echo 2;"
php -r "echo \"something\""
php -r "\$sth = 2.5; echo \$sth;"

I wyniki:

1
2
3
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ć:

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:
1
<?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:

1
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:

1
2
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?