create_functionCreate a function dynamically by evaluating a string of code
&warn.deprecated.function-7-2-0.removed-8-0-0;
&reftitle.description;
stringcreate_functionstringargsstringcode
Creates a function dynamically from the parameters passed, and returns a unique name for it.
This function internally performs an eval and as such has the
same security issues as eval. It also has bad performance
and memory usage characteristics, because the created functions are global and
can not be freed.
A native
anonymous function should be used instead.
&reftitle.parameters;
It is normally advisable to pass these parameters as
single quoted
strings. If using double quoted
strings, variable names in the code need to be escaped carefully, e.g.
\$somevar.
args
The function arguments, as a single comma-separated string.
code
The function code.
&reftitle.returnvalues;
Returns a unique function name as a string, &return.falseforfailure;.
Note that the name contains a non-printable character ("\0"),
so care should be taken when printing the name or incorporating it in any other
string.
&reftitle.examples;
Creating a function dynamically, with create_function
or anonymous functions
You can use a dynamically created function, to (for example) create a function from
information gathered at run time. First, using create_function:
]]>
Now the same code, using an anonymous function;
note that the code and arguments are no longer contained in strings:
]]>
&example.outputs;
Making a general processing function, with create_function
or anonymous functions
Another use could be to have general handler function that can apply a set
of operations to a list of parameters:
=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);
?>
]]>
Again, here is the same code using
anonymous functions.
Note that variable names in the code no longer need to be escaped,
because they are not enclosed in a string.
=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);
?>
]]>
&example.outputs;
Using dynamic functions as callback functions
Perhaps the most common use for dynamic functions
is to pass them as callbacks, for example when using
array_walk or usort.
]]>
Converted to an anonymous function:
]]>
&example.outputs;
the mango
[1] => a mango
[2] => that mango
[3] => this mango
)
]]>
Sorting strings from longest to shortest with create_function:
]]>
Converted to an anonymous function:
]]>
&example.outputs;
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
)
]]>
&reftitle.seealso;
Anonymous functions