create_function

create_function -- Crée une fonction anonyme (style lambda)

Description

string create_function ( string args, string code)

create_function( ) crée une fonction anonyme , à partir des paramètres passés , et retourne un nom de fonction unique . Généralement , les arguments args sont présentés sous la forme d ' une chaîne à guillemets simples , et la même recommandation vaut pour code . La raison de l ' utilisation des guillemets simples est de proteger les noms de variables du remplacement par leur valeur . Si vous utilisez les guillemets doubles , n' oubliez pas d'échapper les noms de variables (i.e . \$avar ) .

Vous pouvez utiliser cette fonction pour ( par exemple ) créer une fonction à partir d'informations récoltés durant l 'éxécution .

Exemple 1 . Création d' une fonction anonyme avec create_function( )

 
?php

 
$newfunc

 
=

 
create_function(

 
'$a,$b'

 
,'return

 
"ln($a

 
)

 
+

 
ln($b

 
)

 
=

 
".log($a

 
*

 
$b)

 
;')

 
;

 
echo

 
"Nouvelle

 
fonction

 
anonyme

 
:

 
$newfunc\n"

 
;

 
echo

 
$newfunc(2,M_E)

 
."\n"

 
;

 
/

 
/

 
affichera

 
:

 
/

 
/

 
Nouvelle

 
fonction

 
anonyme

 
:

 
lambda_1

 
/

 
/

 
ln(2

 
)

 
+

 
ln(2.718281828459

 
)

 
=

 
1.6931471805599

 
?



Ou, pour pouvoir appliquer une fonction générique à une liste d'arguments.

Exemple 2 . Traitement générique par fonction avec create_function( )

 
?php

 
function

 
process(

 
$var1

 
,

 
$var2

 
,

 
$farr

 
)

 
{

 
for

 
($f=0

 
;

 
$f

 
count($farr)

 
;

 
$f++

 
)

 
echo

 
$farr[$f]($var1,$var2)

 
."\n"

 
;

 
}

 
/

 
/

 
création

 
d'une

 
série

 
de

 
fonction

 
mathématiques

 
$f1

 
=

 
'if

 
($a

 
=0

 
)

 
{return

 
"b*a^2

 
=

 
".$b*sqrt($a)

 
;

 
}

 
else

 
{return

 
FALSE

 
;}'

 
;

 
$f2

 
=

 
"return

 
\"min(b^2+a

 
,

 
a^2,b

 
)

 
=

 
\".min(\$a*\$a+\$b,\$b*\$b+\$a)

 
;"

 
;

 
$f3

 
=

 
'if

 
($a

 
0

 
$b

 
!=

 
0

 
)

 
{return

 
"ln(a)

 
/

 
b

 
=

 
".log($a)

 
/

 
$b

 
;

 
}

 
else

 
{return

 
FALSE

 
;}'

 
;

 
$farr

 
=

 
array

 
(

 
create_function('$x,$y'

 
,

 
'return

 
"un

 
peu

 
de

 
trigo

 
:

 
"

 
.(sin($x

 
)

 
+

 
$x*cos($y))

 
;')

 
,

 
create_function('$x,$y'

 
,

 
'return

 
"une

 
hypoténuse

 
:

 
".sqrt($x*$x

 
+

 
$y*$y)

 
;')

 
,

 
create_function('$a,$b'

 
,

 
$f1)

 
,

 
create_function('$a,$b'

 
,

 
$f2)

 
,

 
create_function('$a,$b'

 
,

 
$f3

 
)

 
)

 
;

 
echo

 
"\nUtilisation

 
de

 
la

 
première

 
liste

 
de

 
fonctions

 
anonymes\n"

 
;

 
echo

 
"paramétres

 
:




 
2.3445

 
,

 
M_PI\n"

 
;

 
process(2.3445

 
,

 
M_PI

 
,

 
$farr)

 
;

 
/

 
/

 
Maintenant

 
une

 
liste

 
de

 
fonction

 
sur

 
chaîne

 
de

 
caractères

 
$garr

 
=

 
array

 
(

 
create_function('$b,$a'

 
,'if

 
(strncmp($a,$b,3

 
)

 
==

 
0

 
)

 
return

 
"**

 
\"$a\

 
"

 
'

 
.

 
'et

 
\"$b\"\n**

 
Ces

 
chaînes

 
de

 
ressemblent!

 
!

 
(regarde

 
les

 
trois

 
premiers

 
caractères)"

 
;')

 
,

 
create_function('$a,$b'

 
,'

 
;

 
return

 
"CRCs

 
:

 
".crc32($a)

 
.

 
"

 
,

 
".crc32(b)

 
;')

 
,

 
create_function('$a,$b'

 
,'

 
;

 
return

 
"similarité(a,b

 
)

 
=

 
".similar_text($a,$b

 
,

 
$p)

 
."($p%)"

 
;'

 
)

 
)

 
;

 
echo

 
"\nUtilisation

 
de

 
la

 
secondes

 
liste

 
de

 
fonctions

 
anonymes\n"

 
;

 
process("Twas

 
brilling

 
and

 
the

 
slithy

 
toves"

 
,

 
"Twas

 
the

 
night"

 
,

 
$garr)

 
;

 
?



Et lorsque vous utilisez le code ci-dessus, l'affichage va être
 
Utilisation

 
de

 
la

 
première

 
liste

 
de

 
fonctions

 
anonymes

 
paramétres

 
:




 
2.3445

 
,

 
M_PI

 
Un

 
peu

 
de

 
trigo

 
:

 
-1.6291725057799

 
Une

 
hypoténuse

 
:




 
3.9199852871011

 
b*a^2

 
=

 
4.8103313314525

 
min(

 
b^2+a

 
,

 
a^2,b

 
)

 
=

 
8.6382729035898

 
ln(a

 
/

 
b

 
)

 
=

 
0.27122299212594

 
Utilisation

 
de

 
la

 
seconde

 
liste

 
de

 
fonctions

 
anonymes

 
**

 
"Twas

 
the

 
night

 
"

 
et

 
"Twas

 
brilling

 
and

 
the

 
slithy

 
toves

 
"

 
**

 
Ces

 
chaînes

 
de

 
ressemblent!

 
!

 
(regarde

 
les

 
trois

 
premiers

 
caractères

 
)

 
CRCs

 
:

 
-725381282

 
,

 
1908338681

 
similarité(a,b

 
)

 
=

 
11(45.833333333333%

 
)



Mais l'utilisation la plus courante des fonctions lambda est la fonction de callback, par exemple lors de l'utilisation de array_walk() ou usort()

Exemple 3 . Utilisation de fonctions anonymes comme fonction de callback

 
 ?php

 
$av

 
=

 
array(

 
"la

 
"

 
,"une

 
"

 
,"cette

 
"

 
,"une

 
certaine

 
")

 
;

 
array_walk($av

 
,

 
create_function(

 
'

 
$v,$k'

 
,'$v

 
=

 
$v

 
."maison"

 
;'))

 
;

 
print_r($av)

 
;

 
/

 
/

 
En

 
PHP

 
3

 
utilisez

 
  
   
var_dump(

   
)

  

 

 
?php

 
$av

 
=

 
array("la

 
"

 
,"une

 
"

 
,"cette

 
"

 
,"une

 
certaine

 
")

 
;

 
array_walk($av

 
,

 
create_function(

 
'

 
$v,$k'

 
,'$v

 
=

 
$v

 
."maison"

 
;'))

 
;

 
print_r($av)

 
;

 
/

 
/

 
En

 
PHP

 
3

 
utilisez

 
var_dump(

 
)

 
/

 
/

 
affiche

 
:

 
/

 
/

 
Array

 
/

 
/

 
(

 
/

 
/

 
[0

 
]

 
=

 
la

 
maison

 
/

 
/

 
[1

 
]

 
=

 
une

 
maison

 
/

 
/

 
[2

 
]

 
=

 
cette

 
maison

 
/

 
/

 
[3

 
]

 
=

 
une

 
certaine

 
maison

 
/

 
/

 
)

 
/

 
/

 
un

 
tableau

 
de

 
chaîne

 
classé

 
par

 
taille

 
$sv

 
=

 
array("petite"

 
,"moyenne"

 
,"tres

 
longue"

 
,"vraiment

 
tres

 
longue")

 
;

 
print_r($sv)

 
;

 
/

 
/

 
affiche

 
:

 
/

 
/

 
Array

 
/

 
/

 
(

 
/

 
/

 
[0

 
]

 
=

 
petite

 
/

 
/

 
[1

 
]

 
=

 
moyenne

 
/

 
/

 
[2

 
]

 
=

 
tres

 
longue

 
/

 
/

 
[3

 
]

 
=

 
vraiment

 
tres

 
longue

 
/

 
/

 
)

 
/

 
/

 
Tri

 
par

 
ordre

 
de

 
taille

 
décroissant

 
usort($sv

 
,

 
create_function('$a,$b'

 
,'return

 
strlen($b

 
)

 
-

 
strlen($a)

 
;'))

 
;

 
print_r($sv)

 
;

 
/

 
/

 
outputs

 
:

 
/

 
/

 
Array

 
/

 
/

 
(

 
/

 
/

 
[0

 
]

 
=

 
vraiment

 
tres

 
longue

 
/

 
/

 
[1

 
]

 
=

 
tres

 
longue

 
/

 
/

 
[2

 
]

 
=

 
moyenne

 
/

 
/

 
[3

 
]

 
=

 
petite

 
/

 
/

 
)

 
?