コンテンツにスキップ

PHP/コマンドラインでの活用

出典: フリー教科書『ウィキブックス(Wikibooks)』
< PHP

PHPは、ウェブサーバーでコンテンツを動的に生成する用途を念頭に開発されてきましたが、コマンドラインから単独でスクリプトを実行することができます。 このため、PHPをインストールするだけで、コマンドラインでPHPを使えるようになります。 サーバー側での開発が目的であれば、この章はとばしても構いませんが、サーバー側での開発でも、サーバーとの連携に問題があるのか、PHP言語単体でも問題が再現するの障害分離の目的だけでも、コマンドラインからの使用を習得する意味はあります。

コマンドラインからのスクリプトの実行

[編集]

次のようなスクリプトを用意します。

example.php
#!/usr/local/bin/php -p
<?php
declare(strict_types=1);
header('Content-Type: text/plain');

echo "Hello World!", PHP_EOL;
echo "こんにちは", PHP_EOL;
コードの解説
  1. Shebang:
    #!/usr/local/bin/php -p
    
    この行はShebangで、オペレーションシステムにインタープリターの位置を教えます。また -p はHTTPヘッダーを抑止するオプションです。Shebangは、最初の1行になければならず、余計なスペースも行頭に書くこともできません。
  2. 開始タグ:
    <?php
    
    PHPタグの開始タグ
  3. declare():
    declare(strict_types=1);
    
    strict な型チェックを指定
  4. header():
    header('Content-Type: text/plain');
    
    ウェブコンテンツとして実行した時に、(ディフォルトの text/html ではなく)text/plain(プレーンテキスト)として表示。
    この指定は、コマンドライン向けだけでなく、HTMLの流し込みレンダリングが不要な場合にウェブコンテンツ向けのPHPスクリプトでも有用です。
    同じ要領で、CSV ⇒ text/csv, JSON ⇒ application/json などファイルタイプを明示することができます。
PHP_EOLは、プラットフォームによっての違いを調整済みの改行文字で、’\n’ とするとプラットフォームによっては正しく改行されません。
最後に ?> がないのは間違いではなく、 ?> があると末尾に余計な空白や改行が入るためで、特に require されるモジュールでは、末尾に ?> を書いてはいけません。
コマンドラインでの操作と表示
% chmod +x  example.php
% ./example.php
Hello World!
こんにちは
% _
  1. chmod で、スクリプトに実行属性を与えています。
  2. カレントディレクトリーにはPATHを通してはいけないので、 ./ で明示的に相対パスでスクリプトを指定し実行します。
コマンドラインから php スクリプトを実行すると、ウェブページではなく標準出力(この場合は端末の画面)に出力します。

対話シェル

[編集]

PHPにも、対話シェル( Interactive shell )とよばれるREPL( Read-Eval-Print Loop )があり、PHPインタープリターに直接コマンドを与え、即座に応答を得ることができます。

対話シェルの起動

[編集]
コマンドラインでの操作と表示
% php -a
Interactive shell

php > _
php> が、で対話シェルのプロンプトです。
コマンドラインから、php --interactive でも同様に起動できます。
対話モードの終了
php > exit
% _
quitCTRL-Dでも終了できます。
PHPの文の評価
% php -a
Interactive shell

php > echo 1+1;
2
php > $a = 2**8;
php > echo $a;
256
php > function f($x) { return $x*$x; }
php > echo f(9);
81
php > ^D
% _
多くのREPLと違い、echoを明示しないと評価した値は表示されません。
変数が使えます。
関数を定義できます。
;セミコロンが来るまで改行しても文は評価されません。
スクリプトと同じなのですが、行入力中で勝手が違うのでよく;を忘れると思います。
慌てずに;⏎とタイプしましょう。