PHP OOP - 抽象クラス
PHP - 抽象クラスとメソッドとは?
抽象クラスとメソッドは、親クラスに名前付きメソッドがあるが、タスクを完了するためにその子クラスが必要な場合です。
抽象クラスは、少なくとも1つの抽象メソッドを含むクラスです。抽象メソッドは、宣言されているがコードに実装されていないメソッドです。
抽象クラスまたはメソッドは、abstract
キーワード:
構文
<?php
abstract class ParentClass {
abstract public function someMethod1();
abstract public function someMethod2($name, $color);
abstract public function someMethod3() : string;
}
?>
抽象クラスから継承する場合、子クラスのメソッドは同じ名前で、同じか制限の少ないアクセス修飾子で定義する必要があります。したがって、抽象メソッドが保護されていると定義されている場合、子クラスのメソッドは保護されているかパブリックとして定義されている必要がありますが、プライベートではありません。また、必要な引数の型と数は同じでなければなりません。ただし、子クラスにはさらにオプションの引数がある場合があります。
したがって、子クラスが抽象クラスから継承される場合、次の規則があります。
- 子クラスのメソッドは同じ名前で定義する必要があり、親の抽象メソッドを再宣言します。
- 子クラスのメソッドは、同じか、より制限の少ないアクセス修飾子で定義する必要があります。
- 必要な引数の数は同じである必要があります。ただし、子クラスにはオプションの引数を追加できる場合があります。
例を見てみましょう:
例
<?php
// Parent class
abstract class Car {
public $name;
public function __construct($name) {
$this->name = $name;
}
abstract public function intro() : string;
}
// Child classes
class Audi extends Car {
public function intro() : string {
return "Choose German quality! I'm an $this->name!";
}
}
class Volvo extends Car {
public function intro() : string {
return "Proud to be Swedish! I'm a $this->name!";
}
}
class Citroen extends Car {
public function intro() : string {
return "French extravagance! I'm a $this->name!";
}
}
// Create objects from the child classes
$audi = new audi("Audi");
echo $audi->intro();
echo "<br>";
$volvo = new volvo("Volvo");
echo $volvo->intro();
echo "<br>";
$citroen = new citroen("Citroen");
echo $citroen->intro();
?>
例の説明
Audi、Volvo、およびCitroenクラスは、Carクラスから継承されます。つまり、Audi、Volvo、および Citroenクラスは、継承により、Carクラスのpublic $nameプロパテとpublic __construct()メソッドを使用できます。
ただし、intro()は、すべての子クラスで定義する必要がある抽象メソッドであり、文字列を返す必要があります。
PHP - その他の抽象クラスの例
抽象メソッドに引数がある別の例を見てみましょう。
例
<?php
abstract class ParentClass {
// Abstract method with an argument
abstract protected function prefixName($name);
}
class ChildClass extends ParentClass {
public function prefixName($name) {
if ($name == "John Doe") {
$prefix = "Mr.";
} elseif ($name == "Jane Doe") {
$prefix = "Mrs.";
} else {
$prefix = "";
}
return "{$prefix} {$name}";
}
}
$class = new ChildClass;
echo $class->prefixName("John Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>
抽象メソッドに引数があり、子クラスに親の抽象メソッドで定義されていない 2つのオプションの引数がある別の例を見てみましょう。
例
<?php
abstract class ParentClass {
// Abstract method with an argument
abstract protected function prefixName($name);
}
class ChildClass extends ParentClass {
// The child class may define optional arguments that are not in the parent's abstract method
public function prefixName($name, $separator = ".", $greet = "Dear") {
if ($name == "John Doe") {
$prefix = "Mr";
} elseif ($name == "Jane Doe") {
$prefix = "Mrs";
} else {
$prefix = "";
}
return "{$greet} {$prefix}{$separator} {$name}";
}
}
$class = new ChildClass;
echo $class->prefixName("John Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>
プログラミング学習を加速させる
プログラミングをプロの講師に教えてもらいませんか。