Newsgroup: it.comp.www.php
Titolo: Vsibilità con file include di oggetti istanziati ?!

Salve a tutti ,
un file index.php include un  file session.php che include un file 
database.php.
In session viene definito e istanziato l'oggetto "session", in database 
l'oggetto "database"  (il cui costruttore stabilisce la connessione con un 
db mysql)
Il file index , in base ai contenuti richiesti, richiama con include file 
del tipo contenuto1.php, contenuto2.php etc..
Problema :
in contenuto1.php faccio riferimento all'oggetto session con successo 
(esempio $session->user ..) ma non funziona il riferimento al database 
(esempio  $result = $database->query($q);).
Se definisco "global $database; " nel contenuto1.php funziona anche il 
database .
Perchè session funziona anche se non indicato come global mentre database no 
?
L'utilizzo di include non dovrebbe dare visibilità a tutte le variabili 
definite nei vari file ?
Scusate la banalità della domanda

 (esempio  $result = $database->query($q);).
Il tuo errore e` di istanziare la roba nei file include. Ti bruci buona 
parte dei vantaggi della OOP.
Negli include devi solo definire le classi.
Quando ti serve un oggetto di quella classe lo istanzi il piu` vicino 
possibile a dove lo usi e poi lo scarti subito dopo aver finito di usarlo.
In questo modo eviti rogne con global e soprattutto di non capire se una 
variabile ha il valore che dovrebbe avere.
Bye.


Ciao, il problema era nell'utilizzo all'interno di alcune funzioni che 
usavano solo database e non session: è chiaro che in quel caso è necessario 
utilizzare global per accedere alle variabili.
Concordo con te per la definizione delle classi. Nei due file include di cui 
prima si istanziano solo sessione e database che sono di supporto a tutto il 
resto dell'applicazione .
Secondo te è corretto aprire la connessione con il db e sfruttarla  senza 
chiuderla mai ? In questo modo se si connettono in contemporanea 100 utenti 
vi sarebbero 100 connessioni in parallelo a prescindere dall'effettivo 
utilizzo . Sarebbe + giusto aprire e chiudere le connessioni all'occorrenza 
?

 connessioni all'occorrenza ?
E` piu` giusto strutturare l'accesso al DB, per esempio, con un singleton 
che rappresenta la connessione, e con diverse classi che rappresentano le 
tabelle e usano quel singleton per la connessione.
Bye.

 ?
Quello di cui stai parlando è un connection pool in PHP... problematica
che non ho mai affrontanto (in PHP).
I moderni framework credo risolvino bult-in la questione, ma farlo a
mano... boh...

 Sarebbe + giusto aprire e chiudere le connessioni all'occorrenza ?
No, l'operazione di apertura della connessione è una delle più lente 
nella comunicazione col db.

 ?
eh beh ...
ciao, f.

 Sostanzialmente il connection pool citato da Mau.
Ho approfondito un pochino la questione perché mi interessa più da
vicino e per quanto riguarda PHP la faccenda è più incasinata.
PHP non dà nativamente alcun supporto alla funzionalità di connection
pool, per cui uno si deve "arrabbattare" come può...
La pconnect (persistenza) in molti casi è Male, non tanto per colpa di
PHP stesso ma in dipendenza all'architettura in cui gira.
La funzionalità del connection pool è in alcuni casi data proprio
dall'architettura su cui PHP gira, ovvero il web server (Apache) e
persino il database (Oracle). Sono quindi delle feature che PHP
nativamente non ha ma che "eredita" da chi gli sta intorno...
Insomma, sembra non essere semplice.
E pensare che in Java butti su un paio di jar, scrivi due righe due di
codice, hai un connection pool mininale perfettamente funzionante e
soprattutto perfettamente trasparente al resto dell'applicazione.
saludos,
M.

 soprattutto perfettamente trasparente al resto dell'applicazione.
La differenza e` che in PHP non hai "un'applicazione". Ogni script e` 
isolato dal resto.
Non ti serve il connection pooling perche` comunque non lo puoi 
condividere con gli altri script: sono processi separati, non thread 
della virtual machine. Costa di piu` condividere il connection pool che 
aprire una nuova connessione al DB.
Non pensare di ottimizzare PHP come fai con Java, otterresti solo di 
peggiorare le prestazioni.
Piuttosto orientati su altro. Per esempio memcache per cachare i 
risultati delle query pesanti o le parti di pagina meno soggette a 
variazioni, ecc. O apc o xcache per cachare i precompilati.
Bye.

 isolato dal resto.
Ricordavo di aver letto a tal proposito qualcosa di Lerdorf:
http://articles.sitepoint.com/article/phps-creator-rasmus-lerdorf/4
(terza domanda)