2011-01-13 14 views
5

Sto cercando di migliorare la mia conoscenza di OOP in PHP e ho ricercato classi e interfacce astratte.Real World Esempi di funzioni OOP avanzate per PHP

Quello che ho imparato

  • Sono entrambe le classi che non possono essere se stessi istanziati ma può olny essere estesi (implementato nel caso di interfacce)
  • astratte classi forniscono metodi e proprietà per le altre classi che li estendono.
  • Se una classe utilizza un metodo astratto, la classe stessa deve anche essere astratta.
  • Se un metodo astratto viene definito all'interno di una classe astratta, tutte le classi figlie devono definire i dettagli di tale metodo. I metodi non definiti come astratti possono essere utilizzati allo stesso modo dei metodi normali.
  • Le interfacce definiscono quali metodi deve avere una classe che lo implementa. La funzionalità dei metodi non è definita nell'interfaccia, l'interfaccia offre solo un elenco di metodi che devono essere inclusi nella classe figlio.
  • Un'interfaccia non definisce alcuna proprietà.
  • Le classi possono implementare il maggior numero di interfacce come vogliono ma devono definire un metodo per ogni una delle interfacce attuano

Penso che copre le nozioni di base. Per favore sentiti libero di aggiungerlo se pensi che ci sia qualcosa che mi è sfuggito.

Quello che mi piacerebbe sapere è se ci sono esempi reali di implementazione di queste classi, in particolare la classe di interfaccia. Qualcuno sa di tutte le applicazioni open source che le usano che posso sfogliare per comprenderle meglio e vedere dove e quando vengono utilizzate in modo efficace? Ho trovato esempi di libri che usano animali che non riescono a dimostrare l'importanza di queste classi.

risposta

1

Non un vero esempio mondiale in quanto tale, ma un modello di progettazione in cui di solito si incontrano interfacce e classi astratte è lo Command Pattern. Vedi link per esempio codice.

In generale, la "programmazione su un'interfaccia" è considerata una buona pratica OO, poiché disaccoppia le implementazioni concrete e consente di modificarle più facilmente per altre implementazioni, ad es.invece di chiedere una specifica classe

public function fn(ConcreteClass $obj) 
{ 
    $obj->doSomething() 
} 

basta chiedere che fornisce un certo insieme di metodi

public function fn(MyInterface $obj) 
{ 
    $obj->doSomething() 
} 

Interfacce anche contribuire a prendere in giro a parte grandi strutture di successione. Perché PHP supporta solo l'ereditarietà singola, vedrete spesso le gerarchie in questo modo:

BaseClass -> Logger -> Auth -> User 

dove ognuno di questi contiene aspetti specifici utilizzati all'interno di queste classi. Con un'interfaccia, basta fare

User implements Loggable, Authenticable 

e quindi includere il codice specifico tramite modelli di strategia o Composizione/aggregazione, che è in definitiva molto più gestibile.

Per un elenco di interfacce predefinite in PHP Vedere la mia risposta a:

2

PHP viene fornito con poche interfacce predefinded di default: http://www.php.net/manual/en/reserved.interfaces.php

PHP contiene anche standard di PHP Library (SPL), che definisce più:

Zend Framework è anche un ottimo esempio in cui tali concetti sono Usato. http://framework.zend.com/

+0

Inoltre, ZF2 work in progress wiki: http://framework.zend.com/wiki/display/ZFDEV2 – joksnet

+0

@Gordon: guarda ad esempio a quello: http://www.php.net/manual/en /class.splheap.php – vartec

+1

@ Gordon, ha modificato la risposta – vartec

0

Possiamo dire che l'interfaccia è puramente al 100% di classe astratta ma astratta non lo è. Perché molte volte definiamo la funzione in una classe astratta. Ma nella classe di interfaccia dichiariamo sempre la funzione.

1

La parola chiave final evita la classe di essere prorogato di altre classi, esempio:

class Parent 
{ 
} 

class Mother extends Parent 
{ 
} 

final class Brother extends Mother /* - This class cannot be extended - */ 
{ 
} 

class Pet extends Brother 
{ 
} 

La classe Pet genera un errore affermando: Fatal error: Class Pet may not inherit from final class (Brother)

Questo è disponibile per i metodi anche, quindi se si fa Non voglio permettere che i metodi siano ereditati, facendo sì che la classe figlia abbia lo stesso metodo che agisce come una sostituzione.

http://php.net/manual/en/language.oop5.final.php

Yo usato che vorresti alcuni esempi reali di ciò che le interfacce possono essere utilizzate per, così uno strato di astrazione del database

Hai 1 classe di base che fornisce i metodi di base per iterare il database dati, ma che userebbe una sottoclasse per il tipo di database, come MySql, MsSql ecc., ogni tipo di database avrebbe una sua classe, ma per la classe base per assicurarsi che abbia questi metodi tutti implementerebbero lo stesso interfaccia.

Esempio

interface IDatabaseLayer 
{ 
    public function connect(); 
    public function query(); 
    public function sanitize(); 
    //... 
} 

Quindi la classe base sa che MySql e MsSql hanno i metodi di cui sopra, riducendo così gli errori e di essere più organizzato.

Quando si passano oggetti alle classi per assicurarsi che l'oggetto sia di un certo tipo, PHP5 consente di definire quale tipo di oggetto deve essere passato nei metodi come parametri.

Diciamo che avere 3 classi

  • DatabaseCredentials
  • DatabaseConnection
  • DatabaseQuery

si può specificamente definire nel constructuin di DatabaseConnection che si richiede una classe DatabaseCredentials in questo modo:

class DatabaseConnection implements Connectable 
{ 
    public function __construct(DatabaseCredentials $ConnectionDetails) 
    { 
     $this->Connect($ConnectionDetails->BuildDSN()); 
    } 
} 

Un buon modo per davvero iniziare è con la lettura qui:


Un'altra caratteristica di PHP5 si potrebbe desiderare di guardare è spazi dei nomi, questo permetterà per mantenere il codice organizzato, avere più oggetti con lo stesso nome, rende il caricamento automatico più efficiente

Piccolo esempio:

namespace Database\MySql 
{ 
    class Database{} 
} 

namespace Database\MsSql 
{ 
    class Database{} 
} 

E si può semplicemente utilizzare come:

use Database; 
$Database = new MySql\Database(); 
+0

Ho letto che il carattere del namespace è \. Sono un po 'perso, è/o \? – Aif

+0

No al tuo giusto, solo pseudo codice – RobertPitt

Problemi correlati