[模擬問題] PHP8上級 – 言語リファレンス:PHP 7.4で増えたもの (CTO古庄道明からの出題)

こんにちは。PHP技術者認定機構 CTOの古庄道明です。
今日もPHP8上級試験の模擬問題と解説を紹介します。
以下を解いて出題のイメージと知識を補っていただけると幸いです。

目次

問題

PHP 7.3.x から PHP 7.4.x への移行に関する説明の中で、誤っているものを1つ選びなさい。
明記していない限り、実行は PHP 7.4 で行っている。
なお、すべてのコードの先頭には下記のコードが書かれているものとする。
declare(strict_types=1);
error_reporting(-1);

選択肢

選択肢1
クラスのプロパティは、新たに型宣言をサポートするようになった。そのため、以下のコード
class Hoge {
public int $i;
}

$obj = new Hoge();
$obj->i = ‘string’;
を実行すると、結果は次のとおりとなる。
Fatal error: Uncaught TypeError: Typed property Hoge::$i must be int, string used in …

選択肢2
アロー関数は、暗黙的な値スコープを持った関数を定義する簡便な文法を提供する。
また、アロー関数は親のスコープで使える変数が常に自動で使える。そのため、以下のコード
$x = 11;
$fn = fn($i) => $i * $x;
var_dump($fn);
var_dump( $fn(9) );
は正しく実行でき、結果は次のとおりとなる。
object(Closure)#1 (1) {
[“parameter”]=>
array(1) {
[“$i”]=>
string(10) “”
}
}
int(90)

選択肢3
波括弧を使って配列や文字列のオフセットにアクセスする文法は推奨されなくなった。そのため、以下のコード
$s = ‘abc’;
var_dump( $s{1} );
を実行すると、結果は次のとおりとなる。
Parse error: syntax error, unexpected ‘}’, expecting ‘]’ in …

回答と解説

選択肢1はプロパティの型宣言の設問です。

PHP7.4で、クラスのプロパティは、新たに型宣言をサポートするようになりました。
これによって「プロパティに入れるデータ」は、指定された型である必要があります。
また、前提として「declare(strict_types=1);」が書かれているため、「int宣言だけど文字の ‘123’ が入ってきたから、これは数値の123に暗黙のうちに変換しておこう」といった処理も行われず、エラーになります。

「型が適切ではない」データを入れようとした場合は、TypeError のエラーになります。

そのため、選択肢1に書かれているコードは、書かれている通りのエラーが発生します。
実務において、最近は特に「型を正確に」という現場が増えているように思います。型を厳密に扱うのは、初めの頃は少し難しいですが、バグが減るなど実務上のメリットが大きいので、できるだけ意識するようにしておくとよいでしょう。

選択肢2はアロー関数の設問です。

アロー関数は無名関数を簡潔に書ける文法として、PHP7.4で追加されました。
また、無名関数と異なり、 親のスコープで使える変数が常に自動で使えるようになっています(無名関数だと、明示的にuseが必要になります)。

アロー関数は
・fn キーワードで始まり
・受け取る引数を書き
・=>
・式(値を返す処理)
というフォーマットで記述します。returnキーワードはありませんが、アロー関数は「式で返された値」をreturnしてくれます。

そのため

$fn = function($x, $y) {
    return $x * $y;
};
echo $fn(2, 3);

$fn = fn($x, $y) => $x * $y;
echo $fn(2, 3);

は、処理も結果も同じものになります。

そのため、選択肢2に書かれているコードは、書かれている通り、正しく動きます。
実務では、アロー関数は「使わなくても(無名関数などで)書けるが、アロー関数で書いたほうが少ない文字数ですっきり書ける」ケースがあるので、覚えておくとよいでしょう。

選択肢3は配列の設問です。

PHPでは、配列や文字列のオフセットへのアクセスは $配列[0] と $配列{0} という、2種類の記法をサポートしていました(前者は角括弧(ブラケット / square brackets)、後者は波括弧(中括弧) / curly braces)。
しかし、PHP7.4で、波括弧を使った配列や文字列のオフセットへのアクセスは推奨されなくなりました。
ポイントは「推奨されなくなった」であって「その機能が削除された」ではありません。

そのため、選択肢3に書かれているコードをPHP7.4の環境で実行すると

Deprecated: Array and string offset access syntax with curly braces is deprecated in …
string(1) “b”

となります。非推奨のため、Deprecatedが出る状態です。
なお、PHP8.0ではオフセットを指定してアクセスするための波括弧のサポートが削除されました。
そのため、PHP8.0以降の環境で実行した場合

Fatal error: Array and string offset access syntax with curly braces is no longer supported in …

というエラーになります。

そのため、選択肢3のコードは、書かれているようなエラー出力にはなりません。
実務では、そろそろ「波括弧を使った配列(や文字列)へのアクセス」はほぼ見なくなりましたが。古いコードでは稀に残っているので、古いコードを新しいPHPで動かす時は注意が必要です。

選択肢3に誤りがあるため、解答は3になります。

PHP8上級試験と公式問題集に興味がある方は、以下のページをご覧のうえ、この機会に是非受験ください。

PHP8上級試験
https://www.phpexam.jp/summary/expert8

公式問題集:PHP8技術者認定上級試験公式問題集上巻
https://www.amazon.co.jp/dp/B0FQ1LTTQ4/

公式問題集:PHP8技術者認定上級試験公式問題集下巻ベータ
https://www.amazon.co.jp/dp/B0F7F4H8FP/

また、試験対策セミナーは毎月開催しています。興味がある方は以下のページをご覧いただき是非セミナーにもご参加ください。(フォローいただけるとセミナーのご案内が届くようになります)

PHP技術者認定機構の公式Peatixグループ
https://peatix.com/group/43424
www.phpexam.jp

この記事が気に入ったら
いいね または フォローしてね!

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