《PHP8上級試験対策》Phar::setStub() と __halt_compiler() の正しい理解

  • URLをコピーしました!

はじめに

PHP8上級試験では、普段の開発では触れる機会が少ない Phar(PHP Archive)__halt_compiler() に関する問題が登場します。今回は、試験で引っかかりやすい Phar::setStub() と実行方法 のポイントを整理します。

キーワード: Phar / setStub() / __halt_compiler() / shebang / PHP8上級試験

目次

サンプルコード

<?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 で実行できる」です。

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次