はじめに
PHP8上級試験では、普段の開発では触れる機会が少ない Phar(PHP Archive) や __halt_compiler()
に関する問題が登場します。今回は、試験で引っかかりやすい Phar::setStub() と実行方法 のポイントを整理します。
目次
サンプルコード
<?php
declare(strict_types=1);
error_reporting(-1);
$phar = new Phar(__DIR__ . '/exam.phar');
$phar->setStub('
<?php
var_dump(\'Exam\');
__halt_compiler();
');
このコードを実行すると、exam.phar
という Phar アーカイブが作成されます。
ファイルの先頭には次のようなスタブが埋め込まれます。
※「スタブ(stub)」→ Phar アーカイブにおける「起動用の最初のコード」という意味。
<?php
var_dump('Exam');
__halt_compiler();
その後に Phar のバイナリデータが続きます。
実行方法の違い
php exam.phar と実行する場合
✅ 実行方法(PHPコマンド)
php exam.phar
✅ 出力結果:
string(4) "Exam"
問題なく動作します。
./exam.phar と直接実行する場合
ここで注意が必要です。Linux / macOS などの Unix 系 OS では、スクリプトを直接実行する際に shebang (#!
) を探します。ところが、上記の setStub()
には shebang 行が含まれていないため、./exam.phar
では実行できません。
正しいスタブの書き方(直接実行可能にする場合)
$phar->setStub(
"#!/usr/bin/env php
<?php
var_dump('Exam');
__halt_compiler();"
);
このように shebang を先頭に追加すれば、実行権限を付与して ./exam.phar
を直接実行できるようになります。
まとめ
setStub()
で Phar の起動スタブを設定できる。__halt_compiler()
はスタブの終端に必須。php exam.phar
なら実行可能。./exam.phar
と直接実行するには shebang が必要。
👉 試験問題の選択肢に「./exam.phar で実行できる」と書かれていたら、それは誤り。
正しくは「php exam.phar で実行できる」です。