Nie od dziś wiadomo, że PHP obsługuje operacje wejścia/wyjścia. Nic nie stoi na przeszkodzie, aby pisać aplikacje konsolowe, które “rozmawiają” z użytkownikiem. Generalnie wszystko sprowadza się do jednego wiersza kodu, który pobiera wpisany przez użytkownika tekst, a następnie zwraca go na przykład do zmiennej.
$input = trim(fgets(STDIN));
echo $input;
Dane od użytkownika można pobierać w pętli, dzięki czemu istnieje możliwość przeprowadzenia dłuższej konwersacji.
while(true) {
echo 'Introduce yourself (to quit, type Q): ';
$input = trim(fgets(STDIN));
if($input === 'Q') break;
echo "Your name is: " . $input . PHP_EOL;
}
echo 'Bye' . PHP_EOL;
Wprawdzie powyższy skrypt będzie w kółko nas pytał o imię, ale i tak jest to spory postęp w stosunku do pierwszego skryptu. Idąc dalej, można udostępnić użytkownikowi możliwość wywoływania funkcji (uwaga! kod jest nieco zabałaganiony – jego celem jest tylko prezentacja możliwości komunikacji z użytkownikiem).
echo 'Type function name to run (Q to quit): ';
$functionToCall = null;
$args = array();
while(true) {
$input = trim(fgets(STDIN));
if($input === 'Q') break;
if($input === 'F') {
echo call_user_func_array($functionToCall, $args);
echo PHP_EOL;
$functionToCall = null;
$args = array();
echo 'Type function name to run (Q to quit): ' . PHP_EOL;
continue;
}
if($functionToCall === null) {
$functionToCall = $input;
echo 'Type function arg (F to finish): ';
}
else {
echo 'Type function arg (F to finish): ';
$args[] = $input;
}
}
echo 'Bye' . PHP_EOL;
function Foo($arg1, $arg2)
{
return 'Hello from Foo! - args: ' . $arg1. ', ' . $arg2;
}
function Bar()
{
return 'Hello from Bar!';
}
Na koniec pozostawiłem ciekawą funkcjonalność – przekazywanie parametrów do skryptu.
echo 'Number of args passed: ' . $argc;
echo PHP_EOL;
echo 'Args passed: ';
print_r($argv);
Powyższy kod po wywołaniu go z wiersza poleceń z dodatkowymi parametrami
php skrypt.php -a -b "tekst ze spacjami" -c
wyświetli
Number of args passed: 5
Args passed: Array
(
[0] => skrypt.php
[1] => -a
[2] => -b
[3] => tekst ze spacjami
[4] => -c
)
Pierwszym elementem tablicy jest nazwa wywołanego skryptu, kolejnymi – oddzielone spacjami parametry. Jeśli zmienne $argv oraz $argc z jakiegoś powodu nie zawierają żadnych danych, proponuję skorzystać z ich odpowiedników $_SERVER[‘argv’] oraz $_SERVER[‘argc’].
W ten oto prosty sposób można rozmawiać z PHP.
