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

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

今回は、PHP7.4.xからPHP8.0.xへの移行に関する問題です。PHP8.0では、nullsafe 演算子(?->)の導入や、数値と非数値文字列の比較挙動の変更など、いくつかの重要な仕様変更が行われました。これらの変更点を正しく理解し、コードの互換性や挙動の違いに注意することが求められますよ。
PRIME STUDY認定模擬問題のリンクはこちらです → https://study.prime-strategy.co.jp/
問題文
PHP 7.4.x から PHP 8.0.x への移行 に関する説明の中で、誤っているものを1つ選びなさい。
なお、すべてのコードの先頭には下記のコードが書かれているものとする。
declare(strict_types=1);
error_reporting(-1);
(1)
PHP 8 では、nullsafe 演算子がサポートされた。そのため、以下のコード
class Hoge {
public function f1() {
echo METHOD, PHP_EOL;
return $this;
}
public function f2() {
echo __METHOD__, PHP_EOL;
return null;
}
public function f3() {
echo __METHOD__, PHP_EOL;
return $this;
}
}
$val = (new Hoge())?->f1()?->f2()?->f3();
var_dump($val);
を実行すると、結果は次のとおりとなる。
Hoge::f1
Hoge::f2
NULL
(2)
PHP 8 では、(厳密でないやり方で) 数値と非数値文字列を比較する場合、数値を文字列にキャストし、文字列と比較するようになった。そのため、以下のコードを
var_dump( 2 == '2' );
var_dump( 0 == '0' );
var_dump( 2 == '2a' );
var_dump( 0 == '' );
var_dump( 0 == 'foo' );
PHP 7.4 で動かすと、結果は次のとおりとなる。
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
PHP 8.0 で動かすと、結果は次のとおりとなる。
bool(true)
bool(true)
bool(false)
bool(false)
bool(false)
(3)
private なメソッドは「継承されない」はずだが、PHP 7 では親のメソッドと同じ名前のメソッドは、親のメソッドの可視性に関係なく、一部の継承ルールがチェックされていたが、これが PHP 8 では変更された。そのため、以下のコードを
class Hoge {
final private function pFunc1() {
echo METHOD, PHP_EOL;
}
}
class Foo extends Hoge {
private function pFunc1() {
parent::pFunc1();
echo METHOD, PHP_EOL;
}
public function callPri() {
$this->pFunc1();
}
}
(new Foo())->callPri();
PHP 7.4 で動かすと、結果は次のとおりとなる。
PHP Fatal error: Cannot override final method Hoge::pFunc1() in …
PHP 8.0 で動かすと、結果は次のとおりとなる。
Hoge::pFunc1
Foo::pFunc1
(4)
PHP 8 では、インタンスに対する ::class がサポートされた。そのため、以下のコードを
class Hoge {
}
var_dump( Hoge::class );
$obj = new Hoge();
var_dump( $obj::class );
PHP 7.4 で動かすと、結果は次のとおりとなる。
PHP Fatal error: Cannot use ::class with dynamic class name in …
PHP 8.0 で動かすと、結果は次のとおりとなる。
string(4) "Hoge"
string(4) "Hoge"
解説
選択肢1の解説
正しいです。
PHP 8 では nullsafe 演算子(?->)が導入され、メソッドチェーンで途中で null が出現した場合でもエラーが発生せず、null が返されるようになります。
選択肢2の解説
正しいです。
PHP 8 では、数値と非数値文字列の比較において、数値が文字列にキャストされ、文字列と比較する動作に変化がありました。PHP 7.4 では、すべて true になりますが、PHP 8 では非数値文字列との比較が false になります。
選択肢3の解説
誤りです。PHP 8 では private メソッドのオーバーライドはできず、Fatal error が発生します。
選択肢4の解説
正しいです。
PHP 8 では、インスタンスに対して ::class を使うことがサポートされ、インスタンスからクラス名を取得することが可能になりました。PHP 7.4 では動的クラス名に対して ::class を使うことができません。
正解選択肢
以上より選択肢3が正解となります。
他の問題へ
模擬問題(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
コメント