Newsgroup: it.comp.www.php
Titolo: inclusione di classi dentro altre classi

Salve a tutti,
ho un "problema" che mi manda fuori di testa perche' non riesco a trovare il 
giusto modo di operare. Ho questi 4 files:
common.php
auth.lib.php
db.lib.php
config.lib.php (singleton)
la common.php mi inizializza smarty e mi crea una variabile per il singleton 
della config.lib.php cosi' che ogni pagina che include la common ha sempre a 
disposizione la configurazione.
Ora, nella db.lib.php avrei la necessita' di includere la common.php per 
poter accedere ai parametri di configurazione. E la mia domanda č dove 
inserisco l'include? Nel costruttore?
La auth.lib.php (classe di auteticazione utenti) avra' bisogno sia della 
common.php che della db.lib.php... anche in questo caso, dove inserisco 
l'include? Dove creo l'istanza della classe?
Il mio problema č che non so come gestire la dipendenza delle classi ed ho 
il timore di creare un intreccio di include dal quale poi non ne esco piu'. 
Quando una classe dipende da un'altra (vedi auth che dipende da db), č 
meglio estenderla o va bene anche includerla ed istanziarla? Come operate 
voi solitamente?
Grazie 1000
Dade 

 operate voi solitamente?
Uso __autoload() :)
I file li dovresti includere, meglio con require_once() o include_once(), 
prima della definizione della classe, ma non e` un problema anche 
includerli dentro la classe, un attimo prima di usarli.
Bye.

 Bye.
il problema è che se gli includo prima (ad esempio includo una classe di 
supporto) poi non ho la visibilita' all'interno della classe che sto 
utilizzando:
db.lib.php
=======
class db{
    function query(){
        echo "eseguo la query";
    }
}
auth.lib.php
========
include_once("db.lib.php");
class auth{
    function __constructor(){
        $a=new auth();
        $a->query();
    }
}
cosi' non funziona :( dovrei fare l'include prima di $a=new auth(); ma è 
"corretto"? Non ho mai visto nessuna classe fare degli include e mi viene da 
domandarmi se ci sono metodi piu' "corretti" per utilizzare classi di 
"supporto" (ad esempio una classe di astrazione di db)
grazie 1000
Dade 

 ha scritto nel messaggio 
news:6ng77iF...@mid.individual.net...

conosci anche un bel tutorial online sulle classi? dove parla di abstract 
extend etc etc?
grazie 1000
Dade 

 classi di "supporto" (ad esempio una classe di astrazione di db)
Ci sono diverse tecniche diverse per gestire l'astrazione dal DB. La piu` 
"in voga" e` l'Active Record, ma io preferisco il Table Data Gateway 
(usato dallo Zend Framework) perche` e` piu` di basso livello.
E, a proposito di Zend Framework, puoi guardare il suo sorgente per vedere 
come gestisce le inclusioni. Questo e` un esempio da 
Zend_Db_Table_Abstract:
public function getReference($tableClassname, $ruleKey = null)
{
...
    if (!isset($refMap[$ruleKey])) {
        require_once "Zend/Db/Table/Exception.php";
        throw new Zend_Db_Table_Exception("No reference rule \"$ruleKey\" 
from table $thisClass to table $tableClassname");
        }
...

 abstract extend etc etc?
No, mi spiace.
Ma i concetti sono gli stessi per tutti i linguaggi OO, con solo lievi 
differenze.
Bye.

 ...
lo scarico subito e cerco di capire un po' come funziona :)
Grazie
Dade 

scusami evito di aprire un nuovo topic visto che piu' o meno l'argomento 
rimane lo stesso... ho un problema di scoping:
config.php:
=======
$pippo="123";
common.php
========
include_once("config.php");
//se faccio un echo di $pippo lo vedo correttamente
test.lib.php
=======
include_once("common.php");
class test{
    function __construct(){
        echo $pippo   //non stampa nulla
    }
}
come mai all'interno della classe non vedo la variabile pippo? In teoria 
dovrei vederla, sbaglio?
Dade 

 Dade

> Dade
 

 
Perchè, come avevi premesso, sei in un altro ambiente (scope).
I vantaggi sono tanti: puoi utilizzare soliti nomi, non rischi di 
sovrascrivere valori, tieni sotto controllo il punto nel quale le 
variabili vengono modificate etc; difatti l'uso del $_GLOBAL o global è 
vivamente sconsigliato.
	Francesco