次のような2つの例を考えてみると、
抽象メソッドを使わないパターン
lang
1<?php
2abstract class A
3{
4 public function f()
5 {
6 throw new BadMethodCallException("should be implement " . __METHOD__);
7 }
8}
9
10class B extends A {}
抽象メソッドを使うパターン
lang
1<?php
2abstract class A
3{
4 abstract public function f();
5}
6
7class B extends A {}
次のように実行した場合、
lang
1<?php
2// ↑のファイルを require する
3require __DIR__ . '/a.php';
4
5$b = new B();
6$b->f();
どちらの場合でも B::f()
をインプリメントしていないためエラーになりますが、
- 抽象メソッドを使わないパターン
$b->f();
でメソッドを呼び出すまでエラーになりません
- 抽象メソッドを使うパターン
後者の方がバグが早期発見できるメリットがあります。
また、抽象メソッドなら継承先のメソッドのシグネチャを強制することができます。
lang
1<?php
2abstract class A
3{
4 public function f(array $a) {}
5}
6
7class B extends A
8{
9 // Strict standards: Declaration of B::f() should be compatible with A::f(array $a)
10 public function f($a)
11 {
12 return $a;
13 }
14}
lang
1<?php
2abstract class A
3{
4 abstract public function f(array $a);
5}
6
7class B extends A
8{
9 // Fatal error: Declaration of B::f() must be compatible with A::f(array $a)
10 public function f($a)
11 {
12 return $a;
13 }
14}
前者だと Strict エラーにしかなりませんが、後者だと Fatal エラーになります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。