Create_function () di PHP rispetto al solo utilizzo di eval ()
-
03-07-2019 - |
Domanda
In PHP hai la funzione create_function () che crea una funzione lambda denominata univoca come questa:
$myFunction = create_function('$foo', 'return $foo;');
$myFunction('bar'); //Returns bar
In realtà è meglio (oltre ad essere più facile) che semplicemente fare:
do{
$myFunction = 'createdFunction_'.rand();
}
while(function_exists($myFunction));
eval("function $myFunction(\$foo) { return \$foo; }");
$myFunction('bar'); //Returns bar
create_function è davvero migliore? (a parte il fatto che è più facile)
Soluzione
In base alla mia comprensione dei documenti pertinenti, [1] entrambi fanno la stessa cosa, create_function () trova solo un nome di funzione univoco per te.
Per rispondere ad altri commenti su questa domanda:
create_function può essere assegnato a una variabile che rende la funzione accessibile ad altre parti del codice, mentre eval è utile solo per l'ambito dato.
Può darsi che eval () venga eseguito nell'ambito corrente, ma le definizioni delle funzioni vengono comunque scaricate nello spazio dei nomi globale. [2] Quindi, ogni volta che definisci una funzione, sarà accessibile ovunque nel tuo programma.
L'uso di eval () ingombrerà l'elenco delle funzioni globali, create_function () non
create_function () restituisce solo una stringa con il nome della nuova funzione, [3] non un tipo speciale di callback. Quindi, entrambe le tecniche inquineranno il tuo spazio dei nomi globale.
Quindi no, a parte create_function () essendo più semplice, non sembra essere migliore di eval ().
Note:
[1] http://au2.php.net/manual /en/functions.user-defined.php ; http://au.php.net/create_function ; http://au.php.net/eval
[2] http://au2.php.net/manual /en/functions.user-defined.php
Altri suggerimenti
L'uso di eval () ingombrerà l'elenco delle funzioni globali, create_function () non lo farà, a parte questo non ci sono grandi differenze. Tuttavia , entrambi i metodi richiedono di scrivere il corpo della funzione all'interno di una stringa PHP che è soggetta a errori e se steste lavorando al mio progetto, vorrei ordinarvi di dichiarare semplicemente una funzione di supporto usando la sintassi normale.
Le funzioni anonime in PHP sono implementate così male che il tuo codice è in realtà meglio non usarle. (Per fortuna questo sarà risolto in PHP 5.3).
Personalmente, ho scoperto che create_function () è estremamente utile durante l'ordinamento di array.
In effetti, ho appena cercato sul web e sembra che la documentazione di PHP ne sia un buon esempio.
http://us.php.net/create_function
Scorri verso il basso fino a Esempio n. 3 Uso di funzioni anonime come funzioni di richiamata .
create_function
può essere assegnato a una variabile rendendo la funzione accessibile ad altre parti del codice, mentre eval
è utile solo per l'ambito dato.
(a parte il fatto che è più facile)
Non capisco come puoi scartarlo così prontamente. Dati i tuoi due esempi, quale è più facile da capire a colpo d'occhio? Create_function ti dice cosa intendi realizzare. Eval no.