PHP OOP - Classi astratte
PHP - Cosa sono le classi e i metodi astratti?
Classi e metodi astratti si verificano quando la classe padre ha un metodo denominato, ma ha bisogno delle sue classi figlie per completare le attività.
Una classe astratta è una classe che contiene almeno un metodo astratto. Un metodo astratto è un metodo dichiarato, ma non implementato nel codice.
Una classe o un metodo astratto è definito con la abstract
parola chiave:
Sintassi
<?php
abstract class
ParentClass {
abstract public function someMethod1();
abstract public function someMethod2($name, $color);
abstract
public function someMethod3() : string;
}
?>
Quando si eredita da una classe astratta, il metodo della classe figlio deve essere definito con lo stesso nome e lo stesso modificatore di accesso o con un modificatore di accesso meno limitato. Quindi, se il metodo astratto è definito come protetto, il metodo della classe figlio deve essere definito come protetto o pubblico, ma non privato. Inoltre, il tipo e il numero di argomenti richiesti devono essere gli stessi. Tuttavia, le classi figlie possono avere anche argomenti facoltativi.
Quindi, quando una classe figlia viene ereditata da una classe astratta, abbiamo le seguenti regole:
- Il metodo della classe figlio deve essere definito con lo stesso nome e ridichiara il metodo astratto padre
- Il metodo della classe figlio deve essere definito con lo stesso modificatore di accesso o con un modificatore di accesso meno limitato
- Il numero di argomenti richiesti deve essere lo stesso. Tuttavia, la classe figlia può avere in aggiunta argomenti facoltativi
Diamo un'occhiata a un esempio:
Esempio
<?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();
?>
Esempio spiegato
Le classi Audi, Volvo e Citroen sono ereditate dalla classe Car. Ciò significa che le classi Audi, Volvo e Citroen possono utilizzare la proprietà public $name così come il metodo public __construct() della classe Car a causa dell'ereditarietà.
Ma intro() è un metodo astratto che dovrebbe essere definito in tutte le classi figlie e dovrebbero restituire una stringa.
PHP - Esempi di classi più astratti
Diamo un'occhiata a un altro esempio in cui il metodo astratto ha un argomento:
Esempio
<?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");
?>
Diamo un'occhiata a un altro esempio in cui il metodo astratto ha un argomento e la classe figlia ha due argomenti opzionali che non sono definiti nel metodo astratto del genitore:
Esempio
<?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");
?>