超PHPerになろう

Enjoy PHP Programming

PHPを「シェル化」する [psy/psysh]

PHPのコードを書いて動かして試行錯誤… するのに、わざわざエディタでコードを書き、保存してphpコマンドを起動する… のは非効率です。そんなときはPsySHを使ってみませう。

PsySHはインタラクティブシェルと呼ばれるジャンルのアプリケーションです。対話環境またはREPL(レプル)とも呼ばれます。RubyにおけるIRBやPry、PythonにおけるpythonコマンドやIPythonと同種のツールです。

公式サイト PsySH
概要 An interactive shell for modern PHP.
パッケージ名 Packagist: psy/psysh
作者 bobthecow (Justin Hileman)
ライセンス MIT License
バージョン v0.6.0 (2015-11-08)

インストールする

Composerを利用します。

composer.phar g require psy/psysh

gはglobalの略で、ホームディレクトリ以下に

$HOME/.composer/vendor/bin/にPATHを通しておくと良いです。

.bashrcであれば、以下のように記述します。

PATH=$HOME/.composer/vendor/bin:$PATH

シェルを再起動してpsyshコマンドが起動できればインストール成功です。

PHP標準の対話環境との比較

php -aで起動すると、PHPの対話環境を起動することは可能です。しかし、echovar_dump()などを明示的に呼び出してやらないと計算結果を目視確認できません。また、SyntaxErrorも非常にわかりにくいです。

一方でPsySHでは、計算結果はそのまま画面にわかりやすく表示されます。また、行末にセミコロン;を付けなくても、自動的に判断して補ってくれます。

あなたの開発するWebアプリケーションをシェル化してみよう

こちらはgを付けず、プロジェクト単位でインストールします。

composer.phar require psy/psysh

この例ではcomposer.jsonがあるディレクトリと同じ場所にshellファイルを作ります。

#!/usr/bin/env php
<?php
// ↓名前空間を利用するプロジェクトでは記述しておく
namespace Nyaan;

// Composerのオートローダーを読み込む
require_once __DIR__ . '/vendor/autoload.php';
// ほかに初期化用のPHPファイルがあれば読み込んでおく
// require_once …

echo __NAMESPACE__ . " shell\n";

$sh = new \Psy\Shell();

// シェル起動直後にプロジェクトのnamespaceを設定する
// 名前空間を利用しないプロジェクトでは↓の行は不要
$sh->addCode(sprintf("namespace %s;", __NAMESPACE__));

$sh->run();

// 終了時に表示するメッセージ
echo "Bye.\n";

これで、Composerのオートローダーで設定されたプロジェクト内のファイルやライブラリを利用可能な状態でシェルが起動します。

デバッガとして利用する

<?php

$awesome = new \AwesomeClass;
$result = $awesome->wonderful();

// ↓停止したい場所に書く
eval(\Psy\sh());

起動されたPsySHでは、その場所にある変数をすべて捕捉することが可能です。

設定

設定ファイルは~/.config/psysh/config.phpに保存します。

この記事では詳述しませんが、PsySH#configureを参照のこと。

castersには配列でクラス名とvar-dumper/Caster形式のCasterクラスの対応表を指定でき、画面に見やすく出力することができます。

tabCompletionMatchersで補完処理を追加することができます。

うまく動かないときは

カーソル移動ができない/ショートカットキーが動かない

readline拡張が有効でないと、PsySHのコマンドラインでカーソルキーを入力したときに^[[Dのように妙な文字が出力されます。また、Ctrl-Aなどで行頭移動なども有効になりません。

そのほかのべんり機能