Esercitazione PHP

PHP HOME Introduzione a PHP Installazione PHP Sintassi PHP Commenti PHP Variabili PHP PHP Eco/Stampa Tipi di dati PHP Stringhe PHP Numeri PHP PHP matematica Costanti PHP Operatori PHP PHP Se...Altro...Altro Passaggio PHP Ciclo PHP Funzioni PHP Array PHP Superglobali PHP RegEx PHP

Moduli PHP

Gestione dei moduli PHP Convalida del modulo PHP Modulo PHP richiesto URL/e-mail del modulo PHP Modulo PHP completo

PHP avanzato

Data e ora PHP PHP Include Gestione dei file PHP Apri/Leggi file PHP Creazione/scrittura di file PHP Caricamento file PHP Cookie PHP Sessioni PHP Filtri PHP Filtri PHP avanzati Funzioni di callback PHP PHP JSON Eccezioni PHP

PHP OOP

PHP Che cos'è OOP Classi/Oggetti PHP Costruttore PHP PHP distruttore Modificatori di accesso PHP Ereditarietà PHP Costanti PHP Classi astratte PHP Interfacce PHP Tratti PHP Metodi statici PHP Proprietà statiche PHP Spazi dei nomi PHP Iterabili PHP

Database MySQL

Database MySQL MySQL Connect MySQL Crea DB MySQL Crea tabella Dati di inserimento MySQL MySQL Ottieni l'ultimo ID MySQL inserisce più MySQL preparato MySQL Seleziona dati MySQL dove MySQL Ordina per MySQL Elimina dati Dati di aggiornamento MySQL Dati limite MySQL

PHP XML

Parser XML PHP Analizzatore PHP SimpleXML PHP SimpleXML - Ottieni PHP XML espatriato PHP XML DOM

PHP - AJAX

Introduzione all'Ajax AJAX PHP Database AJAX XML AJAX Ricerca in tempo reale AJAX Sondaggio AJAX

Esempi PHP

Esempi PHP compilatore PHP Quiz PHP Esercizi PHP Certificato PHP

Riferimento PHP

Panoramica di PHP matrice PHP Calendario PHP Data PHP Directory PHP Errore PHP Eccezione PHP File system PHP Filtro PHP PHP FTP PHP JSON Parole chiave PHP PHP Libxml Posta PHP PHP matematica PHP Varie PHP MySQLi Rete PHP Controllo dell'output PHP RegEx PHP PHP SimpleXML Flusso PHP Stringa PHP Gestione delle variabili PHP Analizzatore XML PHP Zip PHP Fuso orario PHP

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");
?>