如果有人需要将代码中的许多create_function()用例升级为匿名函数,我会使用一个名为Rector的工具。 它遍历代码并以匿名函数1:1替换create_function。它在30 various cases上进行了测试。
安装
composer require rector/rector --dev
设置
假设您要升级/src目录中的代码。
# rector.php
<?php
use Rector\Core\Configuration\Option;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Rector\Php72\Rector\FuncCall\CreateFunctionToAnonymousFunctionRector;
return static function (ContainerConfigurator $containerConfigurator) {
$parameters = $containerConfigurator->parameters();
$parameters->set(Option::PATHS, [
__DIR__ . '/src',
]);
$services = $containerConfigurator->services();
$services->set(CreateFunctionToAnonymousFunctionRector::class);
};
运行您的代码
# this is set run, it only report what it would change
vendor/bin/rector process --config rector.php --dry-run
# this actually changes the code
vendor/bin/rector process --config rector.php
# the "rector.php" config is loaded by default, so we can drop it
vendor/bin/rector process
// This will be a dynamic name that could
// be used as a function like "namespace".
$dynamic_name = 'my_dynamic_name';
// Here's some variables that you could use in the scope of
// your dynamic anonymous functions.
$outerVariable = 'If I need this varible, I can use it';
$outerVariableTwo = 'If I need this varible, I can use it too!';
// Create an array that we can later use and turn into
// and associative array with our new dynamic anonymous functions.
$dynamicAnonFunctions = [];
// Create the first dynamic function.
$dynamicAnonFunctions[($dynamic_name."_func_one")] = function () use ($outerVariable, $dynamic_name) {
echo 'Running: function <b>'.$dynamic_name .'_func_one()</b>';
echo '<br><br>';
echo $outerVariable;
echo '<br><br>';
echo 'This works :)';
echo '<br><br>';
};
// Create the second dynamic function
$dynamicAnonFunctions[($dynamic_name."_func_two")] = function () use ($outerVariableTwo, $dynamic_name) {
echo '- - - - - - - - - - - - - - - - - - - ';
echo '<br><br>';
echo 'Running: function <b>'.$dynamic_name .'_func_two()</b>';
echo '<br><br>';
echo $outerVariableTwo;
echo '<br><br>';
echo 'This also works :)!';
echo '<br><br>';
};
// Call the functions.
$dynamicAnonFunctions[($dynamic_name."_func_one")]();
$dynamicAnonFunctions[($dynamic_name."_func_two")]();
// Halt execution.
exit();
6条答案
按热度按时间lo8azlld1#
我想贡献一个非常简单的情况下,我发现在WordPress主题,似乎工作正常:
具有以下add_filter语句:
替换为:
我们可以看到function()的用法,这是一个非常典型的函数创建方法,代替了过时的create_function()来创建函数。
l5tcr1uw2#
自动升级
如果有人需要将代码中的许多
create_function()
用例升级为匿名函数,我会使用一个名为Rector的工具。它遍历代码并以匿名函数1:1替换
create_function
。它在30 various cases上进行了测试。安装
设置
假设您要升级
/src
目录中的代码。运行您的代码
**编辑:**更新于2020年10月31日,使用PHP Rector 0.8.x语法
vhipe2zx3#
从PHP 7.4开始,您可以使用Arrow function:
Arrow函数比匿名函数要短,并且使用父作用域--所以你可以引用$delimiter而不需要传入它。
dfuffjeb4#
这个匿名函数数组对我很有效,见下面的代码:
只需将其复制到脚本文件中,您就会看到
echo
语句的输出,然后只需将函数重新Map到您自己的意愿即可!快乐编码=)
rqqzpn5f5#
匿名函数解决方案可以工作,但是如果要返回的表达式是字符串形式的,我认为应该使用
eval
。ddhy6vgd6#
您应该能够使用Anonymous Function(aka Closure)调用父作用域的
$delimiter
变量,如下所示: