PHP 7.2 Function create_function() is deprecated
I have used create_function
in my application below.
$callbacks[$delimiter] = create_function('$matches', "return '$delimiter' . strtolower(\$matches[1]);");
But for PHP 7.2.0, the create_function()
is deprecated.
How to fix my code above on PHP 7.2.0.
Solution 1:
You should be able to use an Anonymous Function (aka Closure) with a call to the parent scoped $delimiter
variable, like so:
$callbacks[$delimiter] = function($matches) use ($delimiter) {
return $delimiter . strtolower($matches[1]);
};
Solution 2:
I would like to contribute with a very simple case I found in a Wordpress Theme and seems to work properly:
Having the following add_filter statement:
add_filter( 'option_page_capability_' . ot_options_id(), create_function( '$caps', "return '$caps';" ), 999 );
Replace it for:
add_filter( 'option_page_capability_' . ot_options_id(), function($caps) {return $caps;},999);
We can see the usage of function(), very typical function creation instead of a deprecated create_function() to create functions. Hope it helps.
Solution 3:
Automated Upgrade
If anyone needs to upgrade dozens of create_function()
cases in their code to anonymous functions, I work on a tool called Rector.
It goes through the code and replaces the create_function
with anonymous functions 1:1. It's tested on 30 various cases.
Install
composer require rector/rector --dev
Setup
Let's say you want to upgrade code in the /src
directory.
# 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);
};
Run on your code
# 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
EDIT: Updated 2020-10-31 with PHP Rector 0.8.x syntax