PHPOOP-抽象クラス
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クラスは、継承により、public $ nameプロパティとCarクラスの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");
?>