Newsgroup: it.comp.www.php
Titolo: Mi spiegate le interfacce?

E' incredibile: posseggo 6 manuali php cartacei, la maggior parte di
essi tratta in modo approfondito tutti gli argomenti tranne la
programmazione a oggetti. In questo caso, tutti si limitano a elencare
la sintassi da utilizzare. Cercando in rete, stesso problema. Secondo
voi, è normale?
Non ho ancora capito come usare le interfacce, avendo bisogno
dell'eredità multipla. Faccio un esempio. Ho la classe che dovrò
istanziare:
class Esempio
{
  public function do_something()
  {
     //Fa qualcosa...
  }
}
Poi ho due classi che fungono come delle pseudo-librerie, ad esempio
una ha i metodi per l'invio delle email e l'altra per leggere da
database
class Database
{
  public function do_query()
  {
     //Esegue una query
  }
}
class Mail
{
  public function send_mail()
  {
     //Invia un'email
  }
}
Ora... vorrei che la classe Esempio ereditasse i metodi di Database e
di Mail. Mi spiegate come posso fare usando le interfacce?
Grazie a tutti :-)

 dell'eredità multipla. 
A cosa ti serve l'ereditarieta' multipla?
Perche' non utilizzi l'incapsulazione invece?
Comunque, puoi dare una occhiata qui:
http://www.phpbuilder.com/board/showthread.php?t=10300379
-- 
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/
Vuoi diventare un esperto analista PHP/MySQL?
Vieni a fare uno stage con noi: 
http://www.creativepark.it/stage/

 Mail. Mi spiegate come posso fare usando le interfacce?
Le interfacce non consentono l'ereditarietà multipla nel vero senso della 
parola. Un'interfaccia definisce dei metodi che una classe può 
implementare e una classe può realizzare più interfacce. 
L'implementazione dei metodi però va fatta nelle singole classi non 
nell'interfaccia.
Ciao, MrPink

 
http://www.phpbuilder.com/board/showthread.php?t=10300379
Ok, ci guardo :-)



Sì, ma fino a quello che ho visto adesso dovrebbe venire una cosa così
(mi riferisco all'esempio del mio primo messaggio):
class Esempio implements Database, Mail
{
  public function do_something()
  {
     //Fa qualcosa...
  }
  public function do_query()
  {
     //Esegue una query
  }
 public function send_mail()
  {
     //Invia un'email
  }
}
Poi ho due classi che fungono come delle pseudo-librerie, ad esempio
una ha i metodi per l'invio delle email e l'altra per leggere da
database
interface Database
{
  function do_query()
 }
interface Mail
{
  function send_mail()
}
Non colgo il senso di tutto ciò. Se il corpo delle funzioni verrà
messo comunque nella classe Esempio, a cosa serve?
Ecco cosa non spiegano i vari manuali e guide...

 classe::metodo();
No, intendo dire creare una istanza della classe di cui vorresti
ereditare i metodi ed utilizzarne i metodi dall'interno della tua
classe senza esporre direttamente tutti i metodi della classe
incapsulata (come richiederebbe l'ereditarieta' multipla) oppure
esponendoli tramite una proprieta' che espone direttamente tale oggetto.
class Database
{
  public function do_query()
  {
     //Esegue una query
  }
}
class Mail
{
  public function send_mail()
  {
     //Invia un'email
  }
}
class Manager
{
  protected $db;  
  protected $mail;
  function __constructor() {
    $this->db   =& new Database();
    $this->mail =& new Mail();
  } 
  function send_mail() {
  	$this->mail->send_mail();
  }
  function do_query() {
  	$this->db->do_query();
  }
}
class LazyManager
{
  public $db;  
  public $mail;
  function __constructor() {
    $this->db   =& new Database();
    $this->mail =& new Mail();


 esponendoli tramite una proprieta' che espone direttamente tale oggetto.
Ammetto di non averci pensato :-)
Grazie mille, gentilissimo

     $this->mail =& new Mail();
Questa sintassi non serve piu` con PHP5. Tuti gli oggetti vengono 
memorizzati e passati per riferimento, quindi basta:
$this->db   = new Database();
Qui non cambia molto, ma bisogna stare attenti quando fai le copie (nelle 
chiamate di funzione, per esempio), perche` in PHP4 copiava tutto 
l'oggetto, in PHP5 solo il riferimento (quindi punta allo stesso oggetto).
Adesso basta ricordarsi che il & serve solo per passare per riferimento i 
tipi base (interi e stringhe), mentre non serve per oggetti ed array.
Bye.

 esiste negli altri linguaggi, un motivo ci sarà, no? :-)> Perche' non utilizzi l'incapsulazione invece?
Si, ma chiediti pure di che tipo di classe figlia stiamo parlando
quando è il frutto dell'ereditarietà di una classe Mail ed una
Database?
Questo per dirti che l'ereditarietà multipla può essere un ostacolo
per il programmatore piuttosto che un aiuto. Tant'è che sia Java che
C# non
supportano l'ereditarietà multipla.
Ciao,
    Fabrizio
--website: 
http://www.negusweb.it