Forum und email

create_function

(PHP 4 >= 4.0.1, PHP 5)

create_function — Név nélküli (lambda típusú) függvényt definiál

Leírás

string create_function ( string $args , string $code )

Az átadott paraméterek alapján egy anonim - név nélküli függvényt hoz létre. Az args paramétert általában egyszeres idézőjelek közt szokás átadni, és ez ajánlott a code -ra is. Ennek az az oka, hogy az egyszeres idézőjelek közé fogott sztringekre nem aktiválódik a változó-behelyettesítés, máskülönben macskakörmök használata esetén a változó neveket visszaperjelezned kellene, mint például: \$avar.

Ezzel a függvénnyel - például futási időben nyert információk alapján - definiálhatsz új függvényeket:

Example#1 A create_function() segítségével definiált függvények

<?php
$ujfgv 
create_function('$a,$b''return "ln($a) + ln($b) = " . log($a * $b);');
echo 
"Új névtelen függvényünk: $ujfgv\n"// azért valami neve csak van :)
echo $ujfgv(2M_E) . "\n";
// eredményül kírja:
// Új névtelen függvényünk: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
?>

Vagy egy általános kezelőfüggvény megléte esetén műveletek sorozata alkalmazható egy adott paraméterlistára, pl:

Example#2 Általános feldolgozó függvény létrehozása create_function()-nel.

<?
function feldolgoz($valtozo1$valtozo2$fvtomb
{
    for (
$f=0$f count($fvtomb); $f++) {
      echo 
$fvtomb[$f]($valtozo1$valtozo2) . "\n";
    }
}

// egy csomó matematikai függvény létrehozása
$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;}';
$fv_tomb = array(
        
create_function('$x,$y''return "ezt nem tudom, mi: ".(sin($x) + $x*cos($y));'),
        
create_function('$x,$y''return "az átfogó: ".sqrt($x*$x + $y*$y);'),
        
create_function('$a,$b'$f1),
        
create_function('$a,$b'$f2),
        
create_function('$a,$b'$f3)
    );

echo 
"\nAz első tömb anonim függvényekkel\n";
echo 
"paraméterek: 2.3445, M_PI\n";
feldolgoz(2.3445M_PI$fv_tomb);

// most egy csomó sztringkezelő függvény létrehozása
$fv_tomb2 = array(
        
create_function('$b,$a''if (strncmp($a,$b,3) == 0) return "** \"$a\" '.
        
'és \"$b\"\n** nekem azonosnak tűnik! (az első 3 karakter után)";'),
        
create_function('$a,$b''; return "CRCs: ".crc32($a)." , ".crc32(b);'),
        
create_function('$a,$b''; return "hasonló(a,b) = ".similar_text($a,$b,&$p)."($p%)";')
    );
echo 
"\nA második tömb anonim függvényekkel\n";
feldolgoz("Akkor csillogó és fényes volt.""Akkor este volt."$fv_tomb2);
?>

a fenti kód lefuttatása után a következő fog megjelenni:

Az első tömb anonim függvényekkel
paraméterek: 2.3445, M_PI
ezt nem tudom, mi: -1.6291725057799
az átfogó: 3.9199852871011
b*a^2 = 4.8103313314525
min(b^2+a, a^2,b) = 8.6382729035898
ln(a/b) = 0.27122299212594

A második tömb anonim függvényekkel
** "Akkor csillogó és fényes volt." és "Akkor este volt."
** nekem azonosnak tunik! (az elso 3 karakter utan)
CRCs: -725381282 , 1908338681
hasonló(a,b) = 11(45.833333333333%)

Valószínűleg az anonim függvények legáltalánosabb felhasználási módja az ún. 'callback' függvények létrehozása, pl. az array_walk() vagy az usort() számára.

Example#3 Anonim függvények használata 'callback' függvényként

<?php
$nevelok 
= array("a ""egy ""az ""ez ");
array_walk($nevelokcreate_function('&$v,$k''$v = $v."mangó";'));
print_r($av);
?>

kiírja, hogy:

Array
(
  [0] => a mangó
  [1] => egy mangó
  [2] => az mangó
  [3] => ez mangó
)

String-tömb hossz szerint növekvő sorrendbe rendezése

<?php

$sv 
= array("rovid""hosszabb""egy nagy string""ez valami sztring dolog");
print_r($sv);
?>

kiírja, hogy:

Array
(
  [0] => rovid
  [1] => hosszabb
  [2] => egy nagy sztring
  [3] => ez valami sztring dolog
)

sort it from longer to shorter

<?php

usort
($svcreate_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);

?>

kiírja, hogy:

Array
(
  [0] => ez valami sztring dolog
  [1] => egy nagy sztring
  [2] => hosszabb
  [3] => rovid
)