(PHP 4 >= 4.0.1, PHP 5, PHP 7)
create_function — Kod dizgesini değerlendirerek dinamik olarak bir işlev oluşturur
Bu işlevin kullanımı PHP 7.2.0 itibariyle ÖNERİLMEMEKTE olup PHP 8.0.0'da tamamen KALDIRILMIŞTIR. Bu işleve kesinlikle güvenilmemelidir.
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.
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.
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.
Örnek 1 - 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:
<?php
$işlev = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo $işlev(2, M_E) . "\n";
?>
Ve, isimsiz işlev kullanarak; dikkat edilirse, kod ve bağımsız değişkenler artık dizgelerin içinde değildir:
<?php
$newfunc = function($a,$b) { return "ln($a) + ln($b) = " . log($a * $b); };
echo $newfunc(2, M_E) . "\n";
?>
Yukarıdaki örneğin çıktısı:
ln(2) + ln(2.718281828459) = 1.6931471805599
Örnek 2 - 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:
<?php
function process($var1, $var2, $farr)
{
foreach ($farr as $f) {
echo $f($var1, $var2) . "\n";
}
}
// Birkaç matematik işlevi oluşturalım
$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', 'if ($a >=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.
<?php
function process($var1, $var2, $farr)
{
foreach ($farr as $f) {
echo $f($var1, $var2) . "\n";
}
}
// Birkaç matematik işlevi oluşturalım
$farr = array(
function($x,$y) { return "biraz trig: ".(sin($x) + $x*cos($y)); },
function($x,$y) { return "hipotenüs: ".sqrt($x*$x + $y*$y); },
function($a,$b) { if ($a >=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);
?>
Yukarıdaki örneğin çıktısı:
Birinci dinamik işlev grubumuz bağımsız değişkenler: 2.3445, M_PI biraz trig: -1.6291725057799 hipotenüs: 3.9199852871011 b*a^2 = 4.8103313314525 min(b^2+a, a^2,b) = 8.6382729035898 ln(a)/b = 0.27122299212594 İkinci dinamik işlev grubumuz ** "Gün aydınlanıyordu" ve "Gün yavaş yavaş ışıyordu" ** (ilk üç karaktere bakarak) Bak bu ikisi aynı! CRCs: 2226456759, 3176276925 benzerlik(a,b) = 15(58.823529411765%)
Örnek 3 - 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:
<?php
$av = array("işte ", "bir ", "bu ", "şu ");
array_walk($av, create_function('&$v,$k', '$v = $v . "mango";'));
print_r($av);
?>
İsimsiz işlev kullanarak:
<?php
$av = array("işte ", "bir ", "bu ", "şu ");
array_walk($av, 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 )
Bir dizgeyi create_function() ile uzundan kısaya sıralamak:
<?php
$sv = array("kısa", "daha uzun", "daha da uzun", "daha daha uzun");
echo "Özgün:\n";
print_r($sv);
echo "Sıralı:\n";
usort($sv, create_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);
?>
İsimsiz işlev kullanarak:
<?php
$sv = array("kısa", "daha uzun", "daha da uzun", "daha daha uzun");
echo "Özgün:\n";
print_r($sv);
echo "Sıralı:\n";
usort($sv, function($a,$b) { return strlen($b) - strlen($a); });
print_r($sv);
?>
Yukarıdaki örneğin çıktısı:
Özgün: Array ( [0] => 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 )