PHP e OOP: magic method __autoload, ereditarietà, pianificazione iniziale con UML.

web developer UmbriaArticoli precedenti sullo stesso tema OOP in PHP per navigare in un mare in tempesta:

  1. https://umbriawayinfo.wordpress.com/2019/04/07/programmazione-procedurale-oppure-oop-this-is-the-problem/
  2. https://umbriawaypotenzia.wordpress.com/2019/04/07/php-versione-sette-introdotte-nuove-direttive-per-trasformare-il-linguaggio-in-fortemente-tipicizzato/
  3. https://umbriawaysemplifica.wordpress.com/2019/04/08/ambito-di-visibilita-delle-variabili-in-php-public-protected-private/
  4. https://umbriawaytarget.wordpress.com/2019/04/08/php-oop-magic-method-e-costruttori/
  5. https://umbriawayvalorizza.wordpress.com/2019/04/08/warning-ambito-di-visibilita-publica-delle-classi-encapsulation-e-sicurezza-metodi-getter-e-setter/

In uno dei precedenti studi abbiamo visto che la nostra classe si era evoluta con un metodo nuovo:

/*

function __autoload($classi) {
$filename = __DIR__ . ‘/classi/’ . $classi . ‘.php’;
require_once $filename;
}

*/

Il progettista dell’ applicazione ha l’obbligo di snellire le linee di codice e nel caso di lunghi listati di aggirarare le istruzioni come require_once “classi/Libro.php”; e pertanto con la funzione precedente, definita magic method come il famoso costruttore __construct() possiamo recuperare automaticamente i nostri collegamenti alle classi diminuendo le possibilità di errore nel nostro software inserendo per l’appunto il path dove possiamo recuperare la classe specifica, per l’appunto

/*

function __autoload($classi) {
$filename = __DIR__ . ‘/classi/’ . $classi . ‘.php’;
require_once $filename;
}

*/

che serve a recuperare la definizione delle rispettive classi o gli ingredienti del nostro dolce.

A questo punto non ci resta che studiare l’ereditarietà, ossia quelle relazioni padre e figlio che riguardano le proprietà e i metodi di una classe. Ipotizziamo di avere una classe prodotto generica. A questo punto potrei estendere questa classe a un oggetto figlio creando indifferentemente l’oggetto sedia, libro o televisore, con dei metodi universali GET e SET che posso riutilizzare su oggetti simili al prodotto generico, ereditando dalla superclasse, che posso estendere aggiungendo delle sottoclassi per le gli oggetti libro, sedia o televisione. L’idea è quella di creare delle superclassi universali che estese per ereditarietà generano delle estensioni della superclasse. Tutto ciò avviene introducendo una nuova parola chiave, sempre lavorando sulla visibilità PROTECTED, EXTENDS con il nome delle classe padre che si vuole estendere, in questo caso prodotto che rimanda alla sedia o al libro alla TV. Questi oggetti figlio possono leggere i metodi protetti delle definizioni delle classi genitore. Vediamo un esempio di definizione della classe prodotto:

/*
<?php
class Prodotto {
protected $price;
protected $qta;
protected $database;
public function getPrezzo() {
return $this->price;
}
public function setPrezzo($prezzo) {
$this->price = $prezzo;
}
public function getQta() {
return $this->qta;
}
public function setQta($qta) {
$this->qta = $qta;
}
public function addQta($quantita) {
$this->qta += $quantita;
}
}

*/

Le superclassi possono anche non avere il costruttore se non c’è la necessità di inizializzare le proprietà e nel caso avessimo due costruttori il conflitto padre e figlio non prende in considerazione quello della superclasse ma quello dell’ oggetto sedia figlio della definizione della classe prodotto. Dal punto di vista didattico per capire la portata della parola chiave extends all’ inizio conviene anche angolizzare la programmazione altrui, cercando di studiare le ottimizzazioni sul codice e come le specificità dell’ oggetto singolo vengono gestite partendo dalle funzionalità già presenti nella superclasse. A questo punto la nostra classe Libro diventerà una estensione di una superclasse, facendo attenzione di incapuslare delle proprietà private con l’uso della parola chiave sulla prima riga class Libro extends Prodotto:

/*

class Libro extends Prodotto {
private $titolo;
private $autore;
private $codiceisbn;
private $prezzousato;
public function __construct($tit,$aut,$cod,$qta=1) {
$this->titolo = $tit;
$this-> autore = $aut;
$this-> codiceisbn = $cod;
$this-> qta = $qta;
}
public function getTitolo() {
return $this->titolo;
}
public function getIsbn() {
return $this->codiceisbn;
}
public function setIsbn($isbn) {
$this->codiceisbn = $isbn;
}
public function setPrezzo($prezzo) {
$this->price = $prezzo;
}
public function inPrestito($cod,$qta) {
$this->qta -= $qta;
}
}
*/

A questo punto diamo un occhiata al linguaggio UML acronimo di unified modeling language, “linguaggio di modellizzazione unificato” che utilizza una scatola analitica con tre riquadri, il nome della classe, la lista delle proprietà e quella dei metodi. Questo vale sia per le classi padri e le loro estensioni. In questa fase di pianificazione iniziale si prevedono anche i valori che devono avere le variabili e il tipo di dati da utilizzare per ciascuna. Con protected possiamo accedere anche alle definizione di classi derivate quindi è consigliabile rispetto all’ uso di private. Quindi graficamente possiamo disegnare queste scatole con tre sezioni che al loro interno conterranno tutte le particelle che utilizzeremo nel nostro software.

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Crea un sito o un blog gratuitamente presso WordPress.com.

Su ↑

%d blogger hanno fatto clic su Mi Piace per questo: