【やさしく解説】PHP8上級試験の模擬問題(4)

PHP
スポンサーリンク

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

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

PRIME STUDY認定模擬問題のリンクはこちらです → https://study.prime-strategy.co.jp/ 

問題文

メソッドに関する説明の中で、誤っているものを1つ選びなさい。
なお、すべてのコードの先頭には下記のコードが書かれているものとする。

declare(strict_types=1);
error_reporting(-1);

(1)
PHP において、コンストラクタは、__construct() メソッドで実装される。
そのため、以下のコード

class Hoge {
  public function __construct() { 
    echo __METHOD__, PHP_EOL;
  }
}

$obj = new Hoge();


は正しく実行でき、結果は

Hoge::__construct 

となる。

なお、コンストラクタを有している場合、親クラスのコンストラクタが暗黙の内にコールされることはない。そのため、以下のコード

class Hoge {
  public function __construct() { 
    echo __METHOD__, PHP_EOL;
  }
}

class Foo extends Hoge{
  public function __construct() { 
    echo __METHOD__, PHP_EOL;
  }
}

$obj = new Foo();


を実行すると、結果は

Foo::__construct 

となる。

(2)
親クラスのコンストラクタを実装する場合には、parent::をコールする事が必要となる。
そのため、以下のコード

class Hoge {
  public function __construct() { 
    echo __METHOD__, PHP_EOL;
  }
}

class Foo extends Hoge{
  public function __construct() { 
    parent::__construct(); 
    echo __METHOD__, PHP_EOL;
  }
}

$obj = new Foo();


を実行すると、結果は次のとおりとなる。

Hoge::__construct
Foo::__construct

(3)
PHP において、デストラクタは、__destruct() メソッドで実装される。
そのため、以下のコード

class Hoge {
  public function __destruct() { 
    echo __METHOD__, PHP_EOL;
  }
}

$obj = new Hoge();


は正しく実行でき、結果は

Hoge::__destruct

となる。

なお、デストラクタを有している場合、親クラスのデストラクタは、暗黙の内にコールされる。コールされる順番は「子クラスのデストラクタ → 親クラスのデストラクタ」の順番である。
そのため、以下のコード

class Hoge {
  public function __destruct() { 
    echo __METHOD__, PHP_EOL;
  }
}

class Foo extends Hoge{
  public function __destruct() { 
    echo __METHOD__, PHP_EOL;
  }
}

$obj = new Foo();


を実行すると、結果は次のとおりとなる。

Foo::__destruct
Hoge::__destruct

(4)
__callStatic() マジックメソッドを使うと「アクセス不能なメソッドが静的コンテキストで呼び出された時」に、処理を入れる事ができる。

そのため、以下のコード

class Hoge {
  public static function __callStatic(string $name, array $arguments) {
    echo "call: {$name}", PHP_EOL;
    var_dump($arguments);
  }
}

Hoge::test(1, '2', [3]);


は正しく実行でき、結果は次のとおりとなる。

call: test
array(3) {
  [0]=>
  int(1)
  [1]=>
  string(1) "2"
  [2]=>
  array(1) {
    [0]=>
    int(3)
  }
}


なお、__callStatic() マジックメソッドが動くのは「静的コンテキストで呼び出された時」だけのため、「オブジェクトのコンテキストで呼び出された時」には動かない。
そのため、以下のコード

class Hoge {
  public static function __callStatic(string $name, array $arguments) {
    echo "call: {$name}", PHP_EOL;
    var_dump($arguments);
  }
}

$obj = new Hoge();
$obj->test();


を実行すると、結果は次のとおりとなる。

Fatal error: Uncaught Error: Call to undefined method Hoge::test() in …

解説

選択肢1

正しいです。

PHPの「コンストラクタ」とは、クラスのインスタンス(オブジェクト)が作成されたときに自動的に実行される特別なメソッドのことです。コンストラクタを使うことで、オブジェクトが生成されたときに初期化処理を行うことができます。

このコードでは、オブジェクト $obj が作成(new)されると、自動的に __construct() メソッドが呼び出され、結果として Hoge::__construct が出力されます。

PHPでは、クラスを継承すると、子クラス(サブクラス)も親クラス(スーパークラス)のメソッドやプロパティを利用できます。しかし、親クラスのコンストラクタは自動では呼び出されません。

このため、Hogeクラスを継承しているFooクラスでは、Hogeクラスのコンストラクタは呼び出されません。

親クラスのコンストラクタを呼び出すには、以下のように明示的に記述する必要があります。

class Foo extends Hoge {
  public function __construct() { 
    parent::__construct(); // 親クラスのコンストラクタを明示的に呼び出す
    echo __METHOD__, PHP_EOL;
  }
}

$obj = new Foo();

選択肢2

正しいです。
親クラスのコンストラクタを呼び出すには parent::__construct() を明示的に記述する必要があります。選択肢1と問われていることは同じですね。

選択肢3

誤っています。

デストラクタ (__destruct()) は、オブジェクトが削除されるときに自動的に呼ばれるメソッド です。オブジェクトの 後始末 をするために使われます。例えば、ファイルを閉じたり、データベース接続を解除したりする場面で活用されます。

デストラクタ(__destruct)について、「親クラスのデストラクタは、暗黙の内にコールされる」とありますが、これは誤りです。

PHPは子クラスのデストラクタの終了後に親クラスのデストラクタを自動的に呼び出すことはありません。親クラスのデストラクタを呼びたい場合は、明示的に parent::__destruct() をコールする必要があります。

なお、通常デストラクタは スクリプトの終了時 に呼ばれますが、unset() を使うことでもデストラクタは実行 されます

選択肢4

正しいです。

__callStatic() は、「クラス内に定義されていない静的メソッド」が呼ばれたときに、自動的に実行される特別なメソッドです。

静的メソッド(static)の呼び出しに対応します。存在しないメソッドが呼ばれたときに実行されます。第一引数 $name にメソッド名、第二引数 $arguments に引数が配列で渡されます。

__callStatic() は「静的コンテキスト」でのみ動作します。つまり、オブジェクト(インスタンス)から通常のメソッドとして呼び出すとエラーになります。

なお、インスタンスメソッドには__call() が対応しています。

正解選択肢

以上より選択肢3が正解となります。

他の問題へ

コメント

タイトルとURLをコピーしました