Contents
「第1回 PHP 8 上級 模擬試験」を解説していきます
本記事ではひたすら下記記事の模擬試験の解説をしていきたいと思います!
第1回 PHP 8 上級 模擬試験
https://study.prime-strategy.co.jp/study/ph8ex1/
解説記事一覧
- 【php8上級/準上級試験】模擬問題解説 問題1.~ 3.
- 【php8上級/準上級試験】模擬問題解説 問題4. __construct() __destruct __call() __callStatic()
- 【php8上級/準上級試験】模擬問題解説 問題5. __toString() __invoke() __get() __debugInfo()
- 【php8上級/準上級試験】模擬問題解説 問題6. &参照(リファレンス)unset()
模擬問題 1
「PHPをインストールする」にあたっての一般的な注意事項のうち、誤っているものを1つ選びなさい。
PHPの最新のコードは、公式サイト https://www.php.net/ から、Downloads https://www.php.net/downloads に遷移すると、Changelogの確認を含めて取得できる。
PHPの「最新以外の(古い)コード」は、公式サイトでの提供は全くしていない。そのため、古いバージョンのコードが必要な場合、別途「非公式の外部サイト」からソースコードを入手する必要がある。
ダウンロードできるソースコードの拡張子は「.tar.bz2」「.tar.gz」「.tar.xz」等があるが、解凍すれば中身のコードは同じものである。
Downloads https://www.php.net/downloads にはファイル指紋(sha256)がついているので、ダウンロードしたら、改竄の確認をするとよい。
模擬問題 1 解説
PHP公式サイト(https://www.php.net/downloads)では、最新版以外のバージョンもダウンロード可能です。選択肢 2 は誤り❌です
模擬問題 2
PHPの変数の型についての記述で、誤っているものを1つ選びなさい。
なお、すべてのコードの先頭には下記のコードが書かれているものとする。
declare(strict_types=1);
error_reporting(-1);
下記はマニュアルから一部引用した内容である。
usort ( array &$array , callable $callback ) : bool
整数型 (integer) は整数 ({…, -2, -1, 0, 1, 2, …} という集合) を扱う。
整数のサイズはプラットフォームに依存するが、-2,147,483,648 ~ 2,147,483,647 (32 bit符号付) または -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (64 bit符号付) である事が多い。
integer 型の範囲外の数を指定した場合、float として解釈されるため、用途と環境によっては注意が必要である。
コールバック (callback) は PHP 5.4 以降では callable タイプヒントと呼ばれていた。
これには、あらゆるビルドイン関数、ユーザ定義関数、メソッド、静的なクラスメソッドが指定できるが、言語構造 (例:echo や empty、isset 等) は指定が出来ない。
コールバックに「オブジェクトのメソッド」を指定する場合、 配列の 0 番目の要素にオブジェクトを、 そして 1 番目の要素にメソッド名を指定する必要がある。
静的なクラスメソッドを指定する場合は、配列の 0 番目の要素にクラス名を、1 番目の要素にメソッド名を指定する必要がある。或いは ‘ClassName::methodName’ という形式で指定してもよい。
コールバック (callback) が使われる関数には usort() 関数がある。
そのため、以下のコード
class Hoge {
public static function sort($a, $b) {
return $a <=> $b;
}
}
class Foo {
public function sort($a, $b) {
return $a <=> $b;
}
}
$awk = [3, 1, 2];
usort($awk, [Hoge::class, 'sort']);
var_dump($awk);
$awk = [3, 1, 2];
usort($awk, 'Hoge::sort');
var_dump($awk);
$awk = [3, 1, 2];
usort($awk, [new Foo(), 'sort']);
var_dump($awk);
は正しく実行でき、結果は次のとおりとなる。
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
浮動小数点数 (float / double) は、小数を扱う。
浮動小数点数には精度があり、PHP では通常 IEEE 754 倍精度フォーマットが使われる。
浮動小数点数はどうしても誤差を考慮する必要があるため、例えば「小数を直接比較して等しいかどうかを調べてはいけない」という事を理解する必要がある。
そのため、以下のコード
if (0.3 === (0.1 + 0.2)) {
echo “=>ここにはならない”;
} else {
echo “=>こちらになる”;
}
を実行すると、=>こちらになる という結果が返る。
論理型 (boolean) は「真偽値」とも呼ばれ、値は、true か false か null のいずれかになる。
なお、true、false、null の文字は、大文字で書いても小文字で書いてもよい。
模擬問題 2 解説
問題文について
declare(strict_types=1);
- この設定により、「厳密な型指定モード」が有効になります。
- 厳密な型指定モードでは、関数やメソッドの引数や戻り値に指定された型に厳密に従う必要があります。たとえば、
int
が指定されているところにfloat
やstring
を渡すと、PHPはエラーを発生させます。
error_reporting(-1);
- すべての種類のエラー(警告や通知を含む)を報告する設定です。デバッグ時に有効で、どんな些細な問題も見逃さずに確認できます。
usort ( array &$array , callable $callback ) : bool
usort
は、ユーザー定義の比較関数(コールバック関数)を使用して配列をソートする関数です。
ソートが成功した場合はtrue
を返し、エラーが発生した場合はfalse
を返します。
選択肢 4 について
boolean型は、値としてtrueまたはfalseのどちらかを持つ型です。
null は boolean 型ではなく、null 型に属します。
よって誤り❌です
模擬問題 3
クラスに関する説明の中で、誤っているものを1つ選びなさい。
なお「\
」はバックスラッシュに読み替えること。
また、すべてのコードの先頭には下記のコードが書かれているものとする。
declare(strict_types=1);
error_reporting(-1);
三つの特別なキーワード self と parent そして static がクラス定義の内部からプロパティまたはメソッドにアクセスする際に使用される。
そのため、以下のコード
class Hoge {
public function test_1() {
echo __METHOD__, PHP_EOL;
}
public static function testStatic() {
echo __METHOD__, PHP_EOL;
}
public static function staticCall() {
self::testStatic();
static::testStatic();
}
}
class Foo extends Hoge {
public function test_1() {
parent::test_1();
echo __METHOD__, PHP_EOL;
}
public static function testStatic() {
echo __METHOD__, PHP_EOL;
}
}
$obj = new Foo();
$obj->test_1();
Foo::staticCall();
を実行すると、結果は次のとおりとなる。
Hoge::test_1
Foo::test_1
Hoge::testStatic
Foo::testStatic
static メソッドはオブジェクトのインスタンスを生成せずにコールするため、疑似変数 $this は、 static として宣言されたメソッドの内部から利用することはできない。
そのため、以下のコード
class Hoge {
public static function test() {
var_dump($this);
}
}
Hoge::test();
を実行すると、結果は次のとおりとなる。
Fatal error: Uncaught Error: Using $this when not in object context in …
static プロパティは、アロー演算子 -> によりオブジェクトからアクセス することはできない。
そのため、以下のコード
class Hoge {
static $i = 100;
public function test() {
echo $this->i;
}
}
$obj = new Hoge();
$obj->test();
を実行すると、結果は次のとおりとなる。
Notice: Accessing static property Hoge::$i as non static in …
Warning: Undefined property: Hoge::$i in …
抽象クラスから継承する際、親クラスの宣言で abstract
としてマークされた全てのメソッドは、子クラスで定義されなければならない。
また、これらのメソッドは同等 (あるいはより緩い制約) の可視性で定義される必要がある。
一方でメソッドのシグネチャ (引数の型と順番) については、必須引数の数は同じである必要があるが、型宣言は異なってもかまわない。
そのため、以下のコード
abstract class Hoge {
abstract public function __construct(string $s, array $a);
protected $s;
protected $a;
}
class Foo extends Hoge {
public function __construct(string $s, \arrayObject $a) {
$this->s = $s;
$this->a = $a;
}
}
$obj = new Foo(”, new \arrayObject());
var_dump($obj);
は正しく実行でき、結果は次のとおりとなる。
object(Foo)#1 (2) {
[“s”:protected]=>
string(0) “”
[“a”:protected]=>
object(ArrayObject)#2 (1) {
[“storage”:”ArrayObject”:private]=>
array(0) {
}
}
}
模擬問題 3 解説
(問題文)バックスラッシュ(\)の使用について
最初の問題文にあった「「\
」はバックスラッシュに読み替えること」とありましたが、そもそもバックスラッシュについて説明します。
ざっくりいうと、他の名前空間のクラスを使う場合に必要です。たとえばPHPMailerを使用する下記の場合ですね。
(選択肢1)「selfとstaticの違い」について
self::は呼び出されたクラスを参照し、static::は実行時のクラスを参照します。
上記より選択肢の内容は⭕です
(選択肢2、3)「staticメソッドとthis」について
static メソッドはオブジェクトのインスタンスを生成せずにコールするため、疑似変数 $this は、 static として宣言されたメソッドの内部から利用することはできない。
同様の理由でstaticプロパティにはオブジェクト演算子(->)を使ってアクセスできない
上記より選択肢2、3は⭕
(選択肢4)「abstract:抽象メソッドの型指定の継承ルール」について
- 引数: 子クラスではより広い型に変更不可
- 戻り値: 子クラスではより狭い型に変更可能
つまり子クラスで引数はきびしく、戻り値は緩くなるということですね!
というのも下記の理由があります
- 引数(入力)を厳格に:
- データの整合性を保証
- 予期しない入力を防止
- バグの早期発見
- 戻り値(出力)を柔軟に:
- 拡張性の確保
- 新機能追加の容易さ
- オーバーライドの自由度
選択肢4で上記の型指定のルールを確認すると引数の型が「ArrayObjectとarray」で異なっているため誤り❌です