これは、いくつかの OOP の主題に触れています。
まず、親クラスで宣言されたメソッドを単純にオーバーライドすることは、継承クラスでメソッドを再宣言するのと同じくらい簡単です。
例えば:
class Person {
public function greet(string $whom) {
echo "hello $whom!";
}
}
class Tommy extends Person {
public function greet(string $whom = "everyone") {
echo "Howdy $whom! How are you?";
}
}
$a = new Tommy();
$a->greet('World');
// outputs:
// Howdy World! How are you?
オーバーライドするメソッドで、オーバーライドされたメソッドのロジックを再利用したい場合は、拡張クラスから親のメソッドを呼び出すだけです::
class Tommy
{
public function greet(string $whom)
{
// now with more emphasis!!!
echo parent::greet(strtoupper($whom)) . "!!!!";
}
}
Tommy::greet()
を呼び出すようになりましPerson::greet()
たが、結果を変更してから返します。
注意すべきことの 1 つは、メソッドのオーバーライドは、オーバーライドされたメソッドと互換性がなければならないということです。メソッドの可視性は、元のメソッドよりも制限的であってはならず (可視性を高めても問題ありません)、必要な引数の数と型が競合することはできません。オリジナルデカール付。
引数の型が元の型と衝突せず、親よりも必要な引数が少ないため、これは機能します。
class Leo extends Person {
public function greet(string $whom = "gorgeous", string $greet = "Whatsup" ) {
echo "$greet $whom. How are you?";
}
}
しかし、追加の必須引数があるため、これはそうではありません。これにより、このクラスの元のクラスを透過的に切り替えることができなくなり、次のようにスローされますWarning
。
class BadBob extends Person {
public function greet(string $whom, string $greet ) {
echo "$greet $whom. How are you?";
}
}
さらに、質問で「このメソッドはユーザーがオーバーライドする必要がある」と述べています。メソッドを実際に実装するクライアント クラスが必要な場合は、いくつかのオプションがあります。
抽象クラスとメソッド
これらは、実装が空のままであり、拡張クラスが有効になるために実装する必要があるメソッドです。では、元のクラスPerson
を次のように変更しました。
abstract class Person {
public function greet(string $whom) {
echo "hello $whom!";
}
public abstract function hide();
}
- クラスには抽象メソッドが含まれているため、抽象クラスとしても宣言する必要があります。
- 現在、
Person
直接インスタンス化することはできません。他のクラスでのみ拡張できます。
- これで、既存の
Person
拡張クラスはすべて正しくなくなり、前のコードを実行しようとすると致命的なエラーがスローされます。
Person
現在拡張されている有効なクラスの例は次のとおりです。
class Archie extends Person {
public function hide() {
echo "Hides behind a bush";
}
}
拡張するすべてのクラスは、パブリックメソッドを宣言するPerson
必要があります。hide()
インターフェース
最後に、インターフェースについて言及します。インターフェイスは、実装クラスが満たす必要がある契約です。実装本体なしでパブリック メソッドのグループを宣言します。
例えば:
interface Policeman {
public function arrest(Person $person) : bool;
public function help($what): bool;
}
Person
これで、拡張および実装されたクラスを作成できますPoliceman
。
class Jane extends Person implements Policeman {
public function hide() {
echo "Jane hides in her patrol-car";
}
public function arrest(Person $person): bool{
// implement arrest method
return false;
}
public function shoot($what): bool {
// implements shoot() method
return false;
}
}
重要なのは、拡張できるクラスは1 つだけですが (PHP には多重継承はありません)、複数のインターフェースを実装することは可能であり、クラスが有効であるためにはそれぞれの要件を満たす必要があります。