Newsgroup: it.comp.www.php
Titolo: Creare funzioni dinamicamente

Ciao a tutto il newsgroup.
Avrei una domandina per qualcuno che conosca PhP in maniera abbastanza
avanzata: esiste la possibilitŕ di creare una funzione in maniera dinamica
tramite una riga di codice PhP (qualcosa tipo il "new Function" del
VisualBasic!); la mia necessitŕ č di avere una funzione memorizzata in una
variabile.
Uso: php 4.3.1 su Apache 1.3.26
Qualcuno mi puň aiutare? Grazie.
PS: vorrei evitare di usare "eval"!

 variabile.
Dicci cosa devi fare, che magari c'è un metodo migliore... a cosa ti serve
una funzione memorizzata in una variabile??
Ludovico

 ha scritto nel messaggio
news:bfj0a2$4ic$1...@newsreader.mailgate.org...


 Idee?
Studiati la funzione eval () del PHP.


Puoi utilizzare un' array. Oppure uno switch...Oppure una caterba di If...

 Studiati la funzione eval () del PHP.
Conosco quella funzione ma non voglio passare il codice php come stringa per
poi farne un'evaluate (vedi primo mess.); chiedevo se c'è un'alternativa
come il "new function" utilizzato in VB o se esiste l'oggetto function come
in JS
Volevo semplicemente sapere se php offre questa possibilità, non sono
riuscito a trovare niente del genere nel manuale ma mi sembra strano che non
ci sia questa possibilità dato che è un linguaggio di scripting e non
dovrebbe essere una caratteristica difficile da implementare per un
linguaggio appunto di scripting...

> Puoi utilizzare un' array. Oppure uno switch...Oppure una caterba di If...
"Un'array, uno switch o una caterba di If"???  Non capisco in che modo
dovrei utilizzarli???

 codice impostato dal file ini.
E qui mi sono perso... non capisco il codice da dove lo leggi
e a che ti serve inserire il tutto nell'oggetto. Penso vagamente
all'estensione di una classe, ma boh?
-- 
Valerio Granato
http://www.musicoff.com
 - Music Online For Free
La Grande Comunità Online per Musicisti

 Idee?
Utilizzare le classi e serialize(). In questo modo puoi, all'interno di una
variabile, avere un oggetto con propietą (valori) e metodi (funzioni).
Ludovico

Parlo di una classe che si occupa di leggere dei dati da un'interrogazione
sql e di generare del codice html che lo visualizza nel browser.
oltre a ciò genera dei pulsanti (sempre html) che una volta cliccati devono
eseguire "qualche cosa", questo "qualche cosa" è definito in un file ini (un
file di inizializzazione) dove per ogni pulsante c'è scritto il codice php
che deve essere eseguito.
Nella pagina che deve utilizzare questo oggetto inserisco un include del
file php che definisce la classe e quindi richiamo la creazione della
classe. La classe contiene un costruttore che esegue tutto quello che ho
descritto sopra restituendo il codice html che viene scritto tramite un
echo.
Chiaro ora?

 descritto sopra restituendo il codice html che viene scritto tramite un
inserisci il file dellla classe, ma leggi i pulsanti da un file .ini
non sarebbe possibile utilizzare un file .php anche per includere i file
delle funzioni dei pulsanti?
Cristiano

 variabile, avere un oggetto con propietà (valori) e metodi (funzioni).
Sò cos'è una classe, cos'è il metodo serialize (compresi __wakeup e
__sleep), cos'è una proprietà e una funzione. Infatti quello che ho creato è
un oggetto che si va' ad aprire la connessione al db, esegue
l'interrogazione sql, crea del codice html che visualizza i dati letti, crea
del codice html che visualizza i 5 pulsanti, quello che non riesco a fargli
fare è di creare due proprietà di tipo "funzione" (sò che le variabili non
sono tipizzate in php), in altre parole riesco a leggere le stringhe del
codice php dal file di inizializzazione ma non riesco a utilizzarle per
creare una funzione da memorizzare come variabile della classe che ho
creato...
La mia domanda è: esiste questa possibilità?
Ad esempio JS permette di scrivere una riga di codice del tipo:
     var MyFunc=new Function("return (1+2)");
che crea una variabile denominata MyFunc (che in realtà è una funzione!) che
posso eseguire e che da' come risultato 3.
Esiste un'istruzione equivalente in php? (evitando di usare eval!)

 ha scritto nel messaggio
news:bfj9kf$a1j$1...@newsread.albacom.net...

Ti faccio notare che le funzioni non sono sempre le stesse: uso questo
oggetto in svariate pagine per visualizzare dati diversi che necessitano di
funzioni diverse associate ai 5 pulsanti.
Inoltre la classe è utilizzata in un contesto piuttosto complesso: giusto
per darti un'idea ti dico che l'oggetto creato da questa classe (in una
determinata pagina php) viene serializzato e salvato nella session per
essere poi utilizzato in altre pagine (non sto' qui a spiegarti il perchè,
fonderei tre tastiere prima di riuscire a spiegarti perchè faccio ciò!), in
queste "altre" pagine uso unserialize per recuperare l'oggetto e
unserializze necessita di conoscere la classe dell'oggetto che viene
deserializzato (nessun problema in quanto includo il file php che definisce
la classe); però le funzioni non sono sempre le stesse!
La prima soluzione è quella di utilizzare delle proprietà della classe per
scrivere dentro il codice php (come stringa) da eseguire per ogni pulsante,
quindi quando devo eseguire questo codice uso eval (attualmente faccio così
e funziona); però ho lavorato per anni anche con VB e JS e in particolare JS
permette di scrivere del codice del tipo:
      var MyFunc=new Function("return (1+2)");
Una funzionalità di questo tipo mi permetterebbe di salvare non il codice
php da eseguire ma direttamente delle funzioni come proprietà della classe e
quindi di eseguire semplicemente queste funzioni quando viene premuto uno
dei pulsanti.
La domanda è: esiste una funzionalità del genere in php?
Grazie ancora.
    Ciao

variabile.
Non sono sicuro che sia quello che cerchi, ma:
	$func = 'due';
        $func('pippo');
equivale a scrivere
	due('pippo');
quindi puoi passarlo anche da URL come
	...&handler=due&...
Leonardo
-- 
Time's angles, mages tell, conceal a place
incredible, beyond the mundane mind;
night-shrouded and between the seas of space
dread creatures drift in the ageless winds.

 memorizzata in una variabile.
Secondo me risolvi tutto con un po' di ereditarieta'.
Al posto del file INI crei delle calssi derivate dalla tua classe base 
ed utilizzi quete per ogni pagina. In questo modo definisci solo le 
funzioni "personalizzate" per ogni classe senza dover duplicare codice, 
e con un astruttura piu' sicura, dal punto di vista della compilazione 
e di qualche tipo di PHP injection.
Saluti.

 PS: vorrei evitare di usare "eval"!
string create_function ( string args, string code)
Sebbene il codice del corpo della function è definito come stringa e passato
come parametro alla funzione su scritta.
Il metodo più utilizzato, IMHO, rimane quello proposto da Leonardo Serni.
pbgiorno
--
Fame is a bee.
It has a song.
It has a sting.
Ah, too, it has a wing.
              (Emily Dickinson)

Grazie a tutti...
Ho capito che (purtroppo!) il php non permette effettivamente di
implementare una funzione esattamente con lo stesso risultato che si puň
ottenere in JS; credo che per il momento rimarrň "fermo" continuando ad
utilizzare eval (anche se non mi sembra la soluzione piů elegante č comunque
funzionale e... attualmente implementata!!!)
Grazie a tutti.
    Ciao alla prox!

creato...
Non potresti, in fase di lettura del file ini, creare tutte le funzioni del
caso quindi segnarti nell'oggetto solo il nome della funzione da richiamare?
Oppure non potresti creare direttamente le funzioni in un file da includere
e nel file ini specificare solo il nome?
Ludovico Grossi

 e nel file ini specificare solo il nome?
E' la stessa soluzione a cui sono arrivato io...
Il problema è che io creo l'oggetto nel file A.php, serializzo l'oggetto è
lo salvo nella session; poi ad un certo un file B.php a seguito di una
richiesta di elaborazione da parte dell'utente deserializza l'oggetto ed
esegue la richiesta dell'utente che prevede l'utilizzo di una delle funzioni
in questione (da notare che in un secondo momento potrebbe essere il file
C.php ad eseguire la richiesta dell'utente); quindi:
 - le funzioni non possono essere dichiarate nel file A.php in quanto poi
B.php e C.php non le conoscerebbero e sarebbe inutile che l'oggetto
contenesse semplicemente il nome delle funzioni da richiamare
 - per lo stesso motivo le funzioni non possono essere dichiarate in B.php
in quanto sarebbe C.php a non conoscerle
La soluzione è stata quindi quella di utilizzare una libreria X.php
(contenente tutte le funzioni di cui avevo bisogno) e di scrivere il nome di
questa libreria nell'oggetto assieme ai nomi delle funzioni da richiamare;
in questo modo B.php e C.php provvedono ad includere la libreria menzionata
nell'oggetto prima di richiamare le funzioni in questione.
Comunque la soluzione finale (che mi piace di più perchè la trovo più
pulita) è stata la seguente:
class tFunction {
    var $msNome;
    var $maParametri;
    var $msPhpCode;
    function tFunction($sNome, $aParametri, $sPhpCode) {
        $this->msNome=$sNome;
        $this->maParametri=$aParametri;
        $this->msPhpCode=$sPhpCode;
        $this->_MakeFunc();
    }
    function __WakeUp() {
        $this->_MakeFunc();
    }
    function _MakeFunc() {
        eval('function '.$this->msNome.'('.implode(',',
$this->maParametri).') { '.$this->msPhpCode.' }');
    }
}
Una volta dichiarata questa classe in una libreria di base che viene inclusa
in tutte le pagine sono in grado di richiamare un'istruzione del tipo:
$MyFunc = new tFunction('somma', array('$n1', '$n2'), 'return($n1+$n2);');
A questo punto la variabile $MyFunc è "una variabile di tipo funzione", la
posso memorizzare come attributo dell'oggetto più complesso e in maniera
automatica semplicemente deserializzando l'oggetto viene creata la funzione
(nell'esempio nominata "somma") che posso utilizzare come se fosse definita
nel file corrente.
Credo insomma di aver ottenuto un qualcosa di molto vicino al concetto di
funzione di JS!!!  ;-)
    Andrea Marchetto