Home » Php » PHP 7.2 Function create_function() is deprecated

PHP 7.2 Function create_function() is deprecated

Posted by: admin April 23, 2020 Leave a comment

Questions:

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.

Any idea, how to fix my codes above on PHP 7.2.0.

Thanks for your help,

How to&Answers:

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]);
};

Answer:

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.

Answer:

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

# rector.yml
services:
    Rector\Php72\Rector\FuncCall\CreateFunctionToAnonymousFunctionRector: null

Run on your code

vendor/bin/rector process src --config rector.yml --dry-run
vendor/bin/rector process src --config rector.yml

Answer:

This Array of Anonymous functions worked for me, see code below:

// 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();

Just copy this into your script file and you will see the output from the echo statements, then simply remap the function to your own will!

Happy coding =)