(PHP 4 >= 4.0.1, PHP 5)
create_function — Bir anonim (lamda tarzı) işlev oluşturur
$değiştirgeler
, string $kod
)Verilen değiştirgelerden isimsiz bir işlev oluşturur ve onun için eşsiz bir isim döndürür.
Genellikle bu değiştirgeler tek tırnaklar arasına alınmış bir dizge ile işleve aktarılır. Tek tırnak kullanılmasının nedeni değişken isimlerini çözümleme işleminden korumaktır. Çift tırnak kullanırsanız, değişken adlarını \$avar örneğinde olduğu öncelemeniz gerekecektir.
değiştirgeler
İşlevin değiştirgeleri.
kod
İşlevin kodu.
Hata oluşmamışsa bir dizge olarak işleve eşsiz bir isim, aksi takdirde
FALSE
döndürür.
Örnek 1 - create_function() ile isimsiz işlev oluşturmak
Bu işlevi, çalışma anında toplanan bilgileri kullanarak yeni bir işlev oluşturmak için kullanabilirsiniz.
<?php
$işlev = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "Yeni bir isimsiz işlev: $işlev\n";
echo $işlev(2, M_E) . "\n";
// Çıktısı:
// Yeni bir isimsiz işlev: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
?>
Belki, bir değiştirge listesi üzerinde belli işlemler yapan bir genel işlem işlevi tercih edersiniz:
Örnek 2 - create_function() işlevi ile bir genel işlem işlevi oluşturmak
<?php
function process($var1, $var2, $farr)
{
foreach ($farr as $f) {
echo $f($var1, $var2) . "\n";
}
}
// Birkaç matematik işlevi oluşturalım
$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 "biraz trig: ".(sin($x) + $x*cos($y));'),
create_function('$x,$y', 'return "bir hipotenüs: ".sqrt($x*$x + $y*$y);'),
create_function('$a,$b', $f1),
create_function('$a,$b', $f2),
create_function('$a,$b', $f3)
);
echo "\nİlk isimsiz işlev grubumuz\n";
echo "değiştirgeler: 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);
// birkaç tane de dizge işlevi oluşturalım
$garr = array(
create_function('$b,$a', 'if (strncmp($a, $b, 3) == 0) return "** \"$a\" '.
've \"$b\"\n** (ilk üç karaktere bakarak) Bak bu ikisi aynı!";'),
create_function('$a,$b', '; return "CRC\'ler: " . crc32($a) . ", ".crc32(b);'),
create_function('$a,$b', '; return "benzerlik(a,b) = " . similar_text($a, $b, &$p) . "(%$p)";')
);
echo "\nİkinci isimsiz işlev grubumuz\n";
process("Gün yavaş yavaş ışıyordu", "Gün aydınlanıyordu", $garr);
?>
Yukarıdaki örneğin çıktısı:
İlk isimsiz işlev grubumuz değiştirgeler: 2.3445, M_PI biraz trig: -1.6291725057799 bir hipotenüs: 3.9199852871011 b*a^2 = 4.8103313314525 min(b^2+a, a^2,b) = 8.6382729035898 ln(a)/b = 0.27122299212594 İkinci isimsiz işlev grubumuz ** "Gün aydınlanıyordu" ve "Gün yavaş yavaş ışıyordu" ** (ilk üç karaktere bakarak) Bak bu ikisi aynı! CRC'ler: 2226456759, 1908338681 benzerlik(a,b) = 15(%58.823529411765)
Şüphesiz, lamda tarzı (isimsiz) işlevlerin asıl kullanım amacı geriçağırım işlevleri oluşturmaktır. array_walk() ve usort() işlevlerini kullanan örnekler:
Örnek 3 - İsimsiz işlevlerin geriçağırım işlevlerinde kullanımı
<?php
$av = array("işte ", "bir ", "bu ", "şu ");
array_walk($av, create_function('&$v,$k', '$v = $v . "mango";'));
print_r($av);
?>
Yukarıdaki örneğin çıktısı:
Array ( [0] => işte mango [1] => bir mango [2] => bu mango [3] => şu mango )
Kısadan uzuna sıralanmış dizgelerden oluşan bir dizi:
<?php
$sv = array("kısa", "daha uzun", "daha da uzun", "daha daha uzun");
print_r($sv);
?>
Yukarıdaki örneğin çıktısı:
Array ( [0] => kısa [1] => daha uzun [2] => daha da uzun [3] => daha daha uzun )
Şimdi uzundan kısaya doğru sıralayalım:
<?php
usort($sv, create_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);
?>
Yukarıdaki örneğin çıktısı:
( [0] => daha daha uzun [1] => daha da uzun [2] => daha uzun [3] => kısa )