PHP OOP - Abstrakte Klasse
PHP - Wat is abstrakte klasse en metodes?
Abstrakte klasse en metodes is wanneer die ouerklas 'n benoemde metode het, maar sy kinderklas(se) benodig om die take in te vul.
'n Abstrakte klas is 'n klas wat ten minste een abstrakte metode bevat. 'n Abstrakte metode is 'n metode wat verklaar word, maar nie in die kode geïmplementeer word nie.
'n Abstrakte klas of metode word gedefinieer met die abstract
sleutelwoord:
Sintaksis
<?php
abstract class
ParentClass {
abstract public function someMethod1();
abstract public function someMethod2($name, $color);
abstract
public function someMethod3() : string;
}
?>
Wanneer van 'n abstrakte klas geërf word, moet die kinderklasmetode met dieselfde naam gedefinieer word, en dieselfde of 'n minder beperkte toegangswysiger. Dus, as die abstrakte metode as beskerm gedefinieer word, moet die kinderklasmetode as óf beskerm óf publiek gedefinieer word, maar nie privaat nie. Die tipe en aantal vereiste argumente moet ook dieselfde wees. Die kinderklasse kan egter addisionele opsionele argumente hê.
Dus, wanneer 'n kinderklas van 'n abstrakte klas geërf word, het ons die volgende reëls:
- Die kind klas metode moet gedefinieer word met dieselfde naam en dit herverklaar die ouer abstrakte metode
- Die kinderklasmetode moet met dieselfde of 'n minder beperkte toegangswysiger gedefinieer word
- Die aantal vereiste argumente moet dieselfde wees. Die kinderklas kan egter addisionele opsionele argumente hê
Kom ons kyk na 'n voorbeeld:
Voorbeeld
<?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();
?>
Voorbeeld Verduidelik
Die Audi-, Volvo- en Citroen-klasse word van die Motorklas geërf. Dit beteken dat die Audi-, Volvo- en Citroen-klasse die publieke $name-eiendom sowel as die publieke __construct()-metode van die Car-klas kan gebruik as gevolg van oorerwing.
Maar intro() is 'n abstrakte metode wat in al die kinderklasse gedefinieer moet word en hulle moet 'n string terugstuur.
PHP - Meer abstrakte klasvoorbeelde
Kom ons kyk na nog 'n voorbeeld waar die abstrakte metode 'n argument het:
Voorbeeld
<?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");
?>
Kom ons kyk na nog 'n voorbeeld waar die abstrakte metode 'n argument het, en die kinderklas het twee opsionele argumente wat nie in die ouer se abstrakte metode gedefinieer word nie:
Voorbeeld
<?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");
?>