Newsgroup: it.comp.www.php
Titolo: funzioni globali

 
Consapevole di fare probabilmente una domanda banalissima, mi vergogno  
solo un po' a chiedere:
è possibile chiamare una funzione dichiarata *fuori* dallo script ove  
viene chiamata?
Grazie.


Guarda se require(...) od include(...) fanno al caso tuo.

 Guarda se require(...) od include(...) fanno al caso tuo.
 
Fanno... fanno..
Mi domando però se un uso massiccio può degradare sensibilmente le  
prestazioni (php è interpretato, no?) oppure se si tratta solo di una  
questione di principio.
Grazie.


Non è facile rispondere a questa domanda.
 
Diciamo che se un programmatore dovesse scrivere wordpress in un singolo
file, diventerebbe un progetto ingestibile.
Quindi la divisione in più file è utile soprattutto ai programmatori (se
il progetto è grande, è impensabile che tutto il team lavori su un
singolo file).
Dal lato del PHP, il lavoro del server per recuperare i file è meno
impattante rispetto ad altri fattori (ci sono spesso cache a vari
livelli che riducono di molto la latenza nel recupero dei file).
 


 
Capisco bene.
Ma se, per esempio, io volessi "include/require" paths, username,  
password, ecc. in uno solo file per interrogare in maniera flessibile un  
database tramite svariati script, i maniera tale che con una sola modifica  
del file da includere potrei reindirizzare correttamente svariate queries  
su diversi database, questo sarebbe molto gravoso?
 
Farò delle prove, ma forse qualcuno ha già delle esperienze in merito.
Grazie.


Devi includerla prima. Non esiste un autoload per le funzioni, e neanche un
modo semplice per ottenerlo (AFAIK).
 
Puoi inventartelo pero' tu:
 
	$result = user_function('cippirimerlo', $param1, $param2);
 
...e se la funzione cippirimerlo() non esiste, solo allora va a cercarsi il
file functions/cippirimerlo.php dove DEVE essere definita.
 
Pero' ti scordi di chiamarla nel modo veloce
 
	$result = cippirimerlo($param1, $param2).
 
Leonardo AFAHK
 
-- 
 
Questi non hanno speranza di morte; e la lor cieca vita e' tanto bassa,
Che 'nvidiosi son d'ogne altra sorte. Fama di loro il mondo esser non lassa;
Misericordia e Giustizia li sdegna; non ragioniam di lor, ma guarda e passa.

 svariate queries su diversi database, questo sarebbe molto gravoso?
 
Una singola query su database, anche la "select * from t where id=1", 
pesa più o meno come qualche centinaio di file inclusi, quindi io mi 
concentrerei più a ottimizzare il numero di query piuttosto che sul 
numero di file di cui è composto il tuo progetto.
 
Bye.

 questione di principio.
 
PHP non è più interpretato, più o meno dalla 4.qualcosa. Viene 
precompilato in bytecode e, da PHP 5.5, oltre che nelle versioni 
precedenti se usi APC o simili, anche cachato già in bytecode.
 
Ma anche se non fosse cachato il bytecode, il S.O. tiene in cache i file 
più letti.
 
Tutto questo per dire che se spezzi il tuo software in vari file, quelli 
che vengono usati più spesso sono quasi certamente in RAM, e quasi 
certamente già compilati e pronti all'esecuzione.
 
Fare un singolo file con tutto dentro significa farlo molto grosso, 
quindi ridurre (anche se di poco) la possibilità che sia cachato 
(compilato o meno).
 
Stiamo comunque parlando di millesimi di secondo, quindi a meno che tu 
non abbia più di 100 connessioni al secondo su un single core a 1 GHz con 
128 MB di RAM, non te ne accorgerai nemmeno.
 
E, se le hai, cambia server. :P
 
Bye.

prestazioni
 
Dipende. Se lo fai bene, aumentano :-)
 
Per "farlo bene" significa dividere i file in aree funzionali tali che in ogni
file (o gruppo di file) ci siano chiamate con elevata interdipendenza, mentre,
fra gruppo e gruppo, la dipendenza e' poca.
 
A quel punto succede che, se hai vari tipi di chiamate da HTTP, alcuni file in
alcune chiamate tu non li includi proprio (banalmente "auth" nelle chiamate in
cui non ti serve autenticazione, "db" dove non ti serve il database, "admin" e
cosi' via).
 
Oltre a vari altri vantaggi in sede di manutenzione del codice, suddividere in
un marasma di file organizzati saggiamente riduce l'occupazione di memoria, ed
aumenta [non tantissimo; PHP non e' {piu'} compilato] la velocita' totale.
 
Leonardo


 numero di file di cui è composto il tuo progetto.
 
Grazie. Questo si chiama essere chiari e precisi.

 precedenti se usi APC o simili, anche cachato già in bytecode.
 
Puoi spiegare a uno che ha sempre "compilato" solo in Pascal e un po' in C  
che cosa vuol dire "Viene precompilato in bytecode" parlando di PHP?
Grazie.

 C che cosa vuol dire "Viene precompilato in bytecode" parlando di PHP?
 
Significa che non devi fare niente, fa tutto da solo. :D
 
I linguaggi dinamici girano praticamente tutto in una virtual machine che 
capisce un linguaggio personalizzato. Esempio tipico è Java, dove la 
compilazione è esplicita (tramite javac), ma in alcuni linguaggi la 
compilazione è implicita al primo avvio, per esempio in PHP, Python e 
Ruby.
 
In PHP il bytecode viene salvato in una cache in RAM (se usi libapache-
mod-php o php-fpm) che viene gestita automaticamente.
In Python il precompilato viene salvato su disco con estensione .pyc.
In Ruby non lo so. :D
 
Per la natura stessa dei linguaggi (tipi dinamici, allocazione dinamica 
degli array e delle stringhe, introspezione, ecc.) è praticamente 
impossibile compilare in codice macchina e fare un eseguibile che giri 
senza la VM, ma salvando il bytecode ci si risparmia la fare di parsing 
(che, essendo string matching, è quella più pesante) e di syntax 
checking, e si passa direttamente all'esecuzione.
 
Bye.

 checking, e si passa direttamente all'esecuzione.
 
Grazie davvero.