create_function

(PHP 4 >= 4.0.1, PHP 5, PHP 7)

create_functionKod dizgesini değerlendirerek dinamik olarak bir işlev oluşturur

Uyarı

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.

Açıklama

create_function(string$bağımsız_değişkenler, string$kod): string

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.

Dikkat

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.

Bağımsız Değişkenler

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.

Dönen Değerler

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.

Örnekler

Ö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 )

Ayrıca Bakınız

To Top