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

PHP初級レベルから脱却して中級/上級レベルにいきたい人にピッタリの内容ですね。
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が正解となります。
コメント