create_functionKod dizgesini değerlendirerek dinamik olarak bir işlev oluşturur
&warn.deprecated.function-7-2-0.removed-8-0-0;
&reftitle.description;
stringcreate_functionstringbağımsız_değişkenlerstringkod
Verilen bağımsız değişkenlerden dinamik olarak bir işlev oluşturur ve onun için
eşsiz bir isim döndürür.
Bu işlev dahili olarak bir eval çağrısı yapar, bu
nedenle eval ile aynı güvenlik sorunlarına sahiptir.
Ayrıca, oluşturulan işlev küresel bağlamda ve serbest bırakılamaz
olduğundan kötü başarım ve bellek kullanımı özellikleri de vardır.
Bu işlev yerine yerleşik bir isimsiz
işlev kullanılmalıdır.
&reftitle.parameters;
Normalde bu bağımsız değişkenleri
tek tırnaklı
dizgeler olarak aktarmanız önerilir.
Çift tırnaklı
dizgeler kullanılırsa, koddaki değişken adlarının
\$somevar örneğindeki gibi dikkatli bir şekilde
öncelenmesi gerekecektir.
bağımsız_değişkenler
Tek tırnaklı dizge olarak, işlevin bağımsız değişkenleri.
kod
İşlevin kodu.
&reftitle.returnvalues;
Başarı durumunda bir dizge olarak işleve eşsiz bir isim, aksi takdirde
&false; döndürür. İşlev isminin yazdırılamayan bir karakter
("\0") içerdiği unutulmamalıdır, bu nedenle bu isim
yazdırılırken veya başka bir dizgeye eklenirken dikkatli olunmalıdır.
&reftitle.examples;
-
create_function veya isimsiz işlevlerle ile bir
işlevin dinamik olarak oluşturulması
Çalışma anında toplanan bilgileri kullanarak yeni bir işlev
oluşturmak için dinamik olarak oluşturulmuş bir işlev kullanabilirsiniz.
Önce, create_function kullanarak:
]]>
Ve, isimsiz işlev kullanarak;
dikkat edilirse, kod ve bağımsız değişkenler artık dizgelerin içinde değildir:
]]>
&example.outputs;
- create_function işlevi veya isimsiz
işlevlerle bir genel işlem işlevi oluşturmak
Diğer bir kullanım, bir bağımsız değişken listesi üzerinde belli işlemler yapan
genel bir işleyici işlev olabilir:
=0) {return "b*a^2 = ".$b*sqrt($a);} else {return false;}'),
create_function('$a,$b', "return \"min(b^2+a, a^2,b) = \".min(\$a*\$a+\$b,\$b*\$b+\$a);"),
create_function('$a,$b', 'if ($a > 0 && $b != 0) {return "ln(a)/b = ".log($a)/$b; } else { return false; }')
);
echo "\nBirinci dinamik işlev grubumuz\n";
echo "bağımsız değişkenler: 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 "CRCs: " . crc32($a) . ", ".crc32($b);'),
create_function('$a,$b', 'return "benzerlik(a,b) = " . similar_text($a, $b, $p) . "($p%)";')
);
echo "\nİkinci dinamik işlev grubumuz\n";
process("Gün yavaş yavaş ışıyordu", "Gün aydınlanıyordu", $garr);
?>
]]>
Aynı kodu bu kez isimsiz
işlevlerle oluşturuluyor. Dikkat edilirse, koddaki değişken
isimleri artık dizge içinde olmadığından öncelenmemiştir.
=0) {return "b*a^2 = ".$b*sqrt($a);} else {return false;} },
function($a,$b) { return "min(b^2+a, a^2,b) = " . min($a*$a+$b, $b*$b+$a); },
function($a,$b) { if ($a > 0 && $b != 0) {return "ln(a)/b = ".log($a)/$b; } else { return false; } }
);
echo "\nBirinci dinamik işlev grubumuz\n";
echo "bağımsız değişkenler: 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);
// birkaç tane de dizge işlevi oluşturalım
$garr = array(
function($b,$a) { if (strncmp($a, $b, 3) == 0) return "** \"$a\" " .
"ve \"$b\"\n** (ilk üç karaktere bakarak) Bak bu ikisi aynı!"; },
function($a,$b) { return "CRCs: " . crc32($a) . ", ".crc32($b); },
function($a,$b) { return "benzerlik(a,b) = " . similar_text($a, $b, $p) . "($p%)"; }
);echo "\nİkinci dinamik işlev grubumuz\n";
process("Gün yavaş yavaş ışıyordu", "Gün aydınlanıyordu", $garr);
?>
]]>
&example.outputs;
- Dinamik işlevlerin geriçağırım işlevlerinde kullanımı
Şüphesiz, dinamik işlevlerin asıl kullanım amacı geriçağırım
işlevleri oluşturmaktır. array_walk ve
usort işlevlerini kullanan örnekler:
]]>
İsimsiz işlev kullanarak:
]]>
&example.outputs;
işte mango
[1] => bir mango
[2] => bu mango
[3] => şu mango
)
]]>
Bir dizgeyi create_function ile uzundan kısaya
sıralamak:
]]>
İsimsiz işlev kullanarak:
]]>
&example.outputs;
kısa
[1] => daha uzun
[2] => daha da uzun
[3] => daha daha uzun
)
Sıralı:
Array
(
[0] => daha daha uzun
[1] => daha da uzun
[2] => daha uzun
[3] => kısa
)
]]>
&reftitle.seealso;
İsimsiz işlevler