PHP 7.2 Function create_function() is deprecated

前端 未结 4 1183
庸人自扰
庸人自扰 2020-11-22 07:18

I have used create_function in my application below.

$callbacks[$delimiter] = create_function(\'$matches\', \"return \'$delimiter\' . strtolower(\\$matches[1         


        
相关标签:
4条回答
  • 2020-11-22 07:45

    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 =)

    0 讨论(0)
  • 2020-11-22 07:47

    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

    0 讨论(0)
  • 2020-11-22 07:54

    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.

    0 讨论(0)
  • 2020-11-22 08:01

    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]);
    };
    
    0 讨论(0)
提交回复
热议问题