함수 처리 create_function

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

create_function — 코드 문자열을 평가하여 동적으로 함수 만들기

경고 이 함수는 PHP 7.2.0부터 DEPRECATED되었으며 PHP 8.0.0부터 제거되었습니다. 이 함수에 의존하는 것은 매우 권장되지 않습니다.


설명

create_function(string $args, string $code): string

전달된 매개변수에서 동적으로 함수를 만들고 고유한 이름을 반환합니다.

주의 이 함수는 내부적으로 eval()을 수행하므로 eval()과 동일한 보안 문제가 있습니다. 또한 생성된 함수는 전역적이며 해제할 수 없기 때문에 성능 및 메모리 사용 특성이 좋지 않습니다.

대신 네이티브 익명 함수를 사용해야 합니다.


매개변수

일반적으로 이러한 매개변수를 작은 따옴표로 묶은 문자열로 전달하는 것이 좋습니다. 큰따옴표로 묶인 문자열을 사용하는 경우 코드의 변수 이름은 신중하게 이스케이프해야 합니다. \$somevar.

args
함수 인수는 쉼표로 구분된 단일 문자열입니다.
code
함수 코드입니다.

반환 값

고유한 함수 이름을 문자열로 반환하거나 실패 시 false를 반환합니다. 이름에 인쇄할 수 없는 문자("\0")가 포함되어 있으므로 이름을 인쇄하거나 다른 문자열에 통합할 때 주의해야 합니다.


Examples

예제 #1 create_function() 또는 익명 함수를 사용하여 동적으로 함수 만들기

동적으로 생성된 함수를 사용하여 (예를 들어) 런타임에 수집된 정보에서 함수를 생성할 수 있습니다. 먼저 create_function()을 사용하여:

                  
<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo $newfunc(2, M_E) . "\n";
?>
                  
                

이제 익명 함수를 사용하는 동일한 코드입니다. 코드와 인수는 더 이상 문자열에 포함되지 않습니다.

                  
<?php
$newfunc = function($a,$b) { return "ln($a) + ln($b) = " . log($a * $b); };
echo $newfunc(2, M_E) . "\n";
?>
                  
                

위의 예는 다음을 출력합니다.

ln(2) + ln(2.718281828459) = 1.6931471805599
                

예제 #2 create_function() 또는 익명 함수를 사용하여 일반 처리 함수 만들기

또 다른 용도는 매개변수 목록에 일련의 작업을 적용할 수 있는 일반 처리기 함수를 사용하는 것입니다.

                  
<?php
function process($var1, $var2, $farr)
{
    foreach ($farr as $f) {
        echo $f($var1, $var2) . "\n";
    }
}

// create a bunch of math functions
$farr = array(
    create_function('$x,$y', 'return "some trig: ".(sin($x) + $x*cos($y));'),
    create_function('$x,$y', 'return "a hypotenuse: ".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 "\nUsing the first array of dynamic functions\n";
echo "parameters: 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);

// now make a bunch of string processing functions
$garr = array(
    create_function('$b,$a', 'if (strncmp($a, $b, 3) == 0) return "** \"$a\" '.
        'and \"$b\"\n** Look the same to me! (looking at the first 3 chars)";'),
    create_function('$a,$b', 'return "CRCs: " . crc32($a) . ", ".crc32($b);'),
    create_function('$a,$b', 'return "similar(a,b) = " . similar_text($a, $b, $p) . "($p%)";')
);
echo "\nUsing the second array of dynamic functions\n";
process("Twas brilling and the slithy toves", "Twas the night", $garr);
?>
                  
                

다시, 익명 함수를 사용하는 동일한 코드가 있습니다. 코드의 변수 이름은 문자열로 묶이지 않기 때문에 더 이상 이스케이프할 필요가 없습니다.

                  
<?php
function process($var1, $var2, $farr)
{
    foreach ($farr as $f) {
        echo $f($var1, $var2) . "\n";
    }
}

// create a bunch of math functions
$farr = array(
    function($x,$y) { return "some trig: ".(sin($x) + $x*cos($y)); },
    function($x,$y) { return "a hypotenuse: ".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 "\nUsing the first array of dynamic functions\n";
echo "parameters: 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);

// now make a bunch of string processing functions
$garr = array(
    function($b,$a) { if (strncmp($a, $b, 3) == 0) return "** \"$a\" " .
        "and \"$b\"\n** Look the same to me! (looking at the first 3 chars)"; },
    function($a,$b) { return "CRCs: " . crc32($a) . ", ".crc32($b); },
    function($a,$b) { return "similar(a,b) = " . similar_text($a, $b, $p) . "($p%)"; }
);
echo "\nUsing the second array of dynamic functions\n";
process("Twas brilling and the slithy toves", "Twas the night", $garr);
?>
                  
                

위의 예는 다음을 출력합니다.

Using the first array of dynamic functions
parameters: 2.3445, M_PI
some trig: -1.6291725057799
a hypotenuse: 3.9199852871011
b*a^2 = 4.8103313314525
min(b^2+a, a^2,b) = 8.6382729035898
ln(a)/b = 0.27122299212594

Using the second array of dynamic functions
** "Twas the night" and "Twas brilling and the slithy toves"
** Look the same to me! (looking at the first 3 chars)
CRCs: 3569586014, 342550513
similar(a,b) = 11(45.833333333333%)
                

예제 #3 동적 함수를 콜백 함수로 사용

아마도 동적 함수의 가장 일반적인 용도는 예를 들어 array_walk() 또는 usort()를 사용할 때 콜백으로 전달하는 것입니다.

                  
<?php
$av = array("the ", "a ", "that ", "this ");
array_walk($av, create_function('&$v,$k', '$v = $v . "mango";'));
print_r($av);
?>
                  
                

익명 함수로 변환:

                  
<?php
$av = array("the ", "a ", "that ", "this ");
array_walk($av, function(&$v,$k) { $v = $v . "mango"; });
print_r($av);
?>
                  
                

위의 예는 다음을 출력합니다.

Array
(
  [0] => the mango
  [1] => a mango
  [2] => that mango
  [3] => this mango
)
                

create_function()을 사용하여 가장 긴 문자열에서 가장 짧은 문자열로 정렬:

                  
<?php
$sv = array("small", "a big string", "larger", "it is a string thing");
echo "Original:\n";
print_r($sv);
echo "Sorted:\n";
usort($sv, create_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);
?>
                  
                

익명 함수로 변환:

                  
<?php
$sv = array("small", "a big string", "larger", "it is a string thing");
echo "Original:\n";
print_r($sv);
echo "Sorted:\n";
usort($sv, function($a,$b) { return strlen($b) - strlen($a); });
print_r($sv);
?>
                  
                

위의 예는 다음을 출력합니다.

Original:
Array
(
  [0] => small
  [1] => a big string
  [2] => larger
  [3] => it is a string thing
)
Sorted:
Array
(
  [0] => it is a string thing
  [1] => a big string
  [2] => larger
  [3] => small
)
                

기타