
PHP8 上級/準上級試験の認定模擬問題として、プライム・ストラテジー様のPRIME STUDYが認定されているようです。ただ、この模擬問題には解説がありませんので解説をまとめていこうと思います。シリーズ第27回目です。

PHP初級レベルから脱却して中級/上級レベルにいきたい人にピッタリの内容ですね。

今回はPHAR(PHP Archive)に関する問題です。PHARは複数のPHPファイルを1つの実行可能ファイルとして扱う仕組みで、パッケージングや配布に便利な機能です。この問題ではPHARの読み込み方法や実行方法、設定などに関する理解が問われます。しっかり押さえていきましょう!
PRIME STUDY認定模擬問題のリンクはこちらです → https://study.prime-strategy.co.jp/
問題文
関数 に関する説明の中で、誤っているものを1つ選びなさい。
また、すべてのコードには下記のコードが適切な箇所に書かれているものとする。
declare(strict_types=1);
error_reporting(-1);
下記はマニュアルから一部引用した内容である。
public Phar::__construct ( string $fname , int $flags = ? , string $alias = ? )
(1)
phar 拡張モジュールは、PHP アプリケーション全体をひとつの “phar” (PHP Archive) ファイルにまとめて配布やインストールを容易にするためのものである。
例えば、PHP で最近よく使われている Composer が Phar で配布されている。
そのため、composer.phar の中は
!/usr/bin/env php
という書き出しになっている。
また、中身が PHP ファイルなので、ファイルに実行権限がなくても
php composer.phar
のコマンドラインで動かす事ができる。
(2)
phar のスタブには __HALT_COMPILER() という関数が使われている。
__HALT_COMPILER() は「コンパイラの実行を中止する」関数である。この関数以降はコンパイルされる事がなく、インストール用ファイルのようなデータを PHP スクリプトに埋め込んでいる場合等に使われる。
そのため、以下のコード
echo 'test', PHP_EOL;
__HALT_COMPILER();
;
dummy data
hoge
を実行すると、結果は次のとおりとなる。
Parse error: syntax error, unexpected identifier "data" in …
しかし以下のコード
echo 'test', PHP_EOL;
__HALT_COMPILER();
;
dummy data;
hoge;
を実行すると、結果は次のとおりとなる。
test
(3)
phar のファイルを作る場合は、Phar クラスを用いる。
そのため、hoge.php というファイル名で
class Hoge {
private $i = 999;
}
がある前提で、以下のコード
$obj = new Phar('./exam.phar');
$obj->addFile('hoge.php');
を実行すると exam.phar ができあがる。
ただし php.ini の phar.readonly が 0 でない時は、結果は次のとおりとなる。
Fatal error: Uncaught UnexpectedValueException: creating archive "./exam.phar" disabled by the php.ini setting phar.readonly in …
(4)
phar のファイルを使う場合には、Phar ストリームラッパーを使う。
Phar ストリームラッパーは phar:// から始まる。
そのため、先ほど作成した exam.phar がある前提で、以下のコード
require_once('phar://exam.phar/hoge.php');
$obj = new Hoge();
var_dump($obj);
を実行すると、結果は次のとおりとなる。
object(Hoge)#1 (1) {
["i":"Hoge":private]=>
int(999)
}
解説
選択肢1の解説
誤りです。
composer.phar の中身について「ファイルに実行権限がなくても php composer.phar で動かせる」と書いていますが、composer.phar のファイルに実行権限がないと、直接は実行できません。
php composer.phar というコマンドは、「PHPで明示的に実行している」ので権限がなくてもOKです。ですが、./composer.phar のように直接実行したいなら実行権限が必要です。
また、1行目の #!/usr/bin/env php は「このファイルをスクリプトとして直接実行できるようにするための行」なので、この行がある=実行権限が必要という前提です。
選択肢2の解説
正しいです。
__HALT_COMPILER() は実際にある特殊な関数で、「この行より後のコードは実行も解析もしないで」という命令となります。Pharの中にはPHPコードと一緒に「データ」も入れられるのですが、そこに使われています。
例にある echo のあとに __HALT_COMPILER() を置くと、その後の文字列(dummy dataなど)は無視されるので、エラーにはなりません。
選択肢3の解説
正しいです。
new Phar() を使って .phar ファイルを作れます。
ですが、PHPの設定(phar.readonly=On がデフォルト)だと「作成は禁止」なので、エラーになります。
選択肢4の解説
正しいです。
phar:// という特殊な書き方で、アーカイブの中のファイルにアクセスできます。require_once(‘phar://exam.phar/hoge.php’) のように使うと、中のPHPファイルを読み込めるし、ちゃんとクラスも使えます。
正解選択肢
以上より選択肢1が正解となります。
他の問題へ
模擬問題(1)インストール
模擬問題(2)変数の型
模擬問題(3)クラス
模擬問題(4)メソッドその1
模擬問題(5)メソッドその2
模擬問題(6)リファレンス
模擬問題(7)名前空間
模擬問題(8)エラー
模擬問題(9)定義済みのインターフェイスとクラスおよび SPL インターフェイス
模擬問題(10)SPL
模擬問題(11)定義済の変数
模擬問題(12)PHP7.0.xからPHP7.1.xへの移行
模擬問題(13)可変変数
模擬問題(14)PHP7.3.xからPHP7.4.xへの移行
模擬問題(15)PHP7.4.xからPHP8.0.xへの移行
模擬問題(16)制御構造
模擬問題(17)XSS(クロスサイトスクリプティング)
模擬問題(18)ファイルアップロード
模擬問題(19)推測困難なトークン
模擬問題(20)セッション
模擬問題(21)PHP のメモリ消費
模擬問題(22)関数その1
模擬問題(23)関数その2
模擬問題(24)関数その3
模擬問題(25)関数その4
模擬問題(26)関数その5
模擬問題(27)関数その6
模擬問題(28)関数その7
模擬問題(29)関数その8
模擬問題(30)関数その9
コメント