anonymous and inline functions with php

php

The following is not quite the same as inline function in e.g. c or c++ even though they resemble them in one way or another.

Playing around with PHP I found that inline functions are possible. Consider the following:

<?php

function test () {
    function test2() {
        echo "hello world";
    }
    test2();
}

test(); // this will echo "hello world"

You could also add the above inline function in a class method.

You can only define these functions in the same scope. The following will fail with : PHP Fatal error: Call to undefined function test3()

<?php

function test () {
    function test2() {
        function test3() {
            echo "hello";
        }
    }
    test3();
}

test3(); // this will fail

While this example with deeper nesting is ok (because I call them at the same scope level):

<?php

function test () {
    function test2() {
        function test3() {
        echo "hello";
    }
        test3();
    }
    test2();
}

test(); // this will echo "hello world"
// but test2 will fail

You can only define an inline function once: The following will fail with: Fatal error: Cannot redeclare test2()

<?php

function test () 
    function test2() {
        echo "hello world";
    }
    test2();
}

function _test () {
    function test2() {
        echo "hello world";
    }
    test2();
}

test();
_test(); 

The solution to the above problem will be to just use an anonymous function (which is a function without a name), like in this example:

<?php

function test () {
    $test = function () {
    echo "hello world";
    };
    $test();
}

function _test () {
    $test = function () {
    echo "hello world";
    };
    $test();
}   

test();
_test(); // this will echo "hello world"

Note that you need to end an anonymous function with ;. This will not work

<?php

$test = function () {
    echo "hello world";
}

While this will work:

<?php

$test = function() {
    echo "hello world";
};

Anonymous functions can be nice to use e.g. if you want to make a callback or filter something with your function:

<?php

function test($num, $func) {
    while ($num) {
        $func($num);
        $num--;
    }
}

$anon = function () {
    echo "hello world\n";
};


test(3, $anon); // this will print "hello world" 3 times

Therefor you should always prefer anonymous functions over inline functions. as anonymous functions don't clutter up the main name space.


This page has been viewed 12343 times. First hit: 30-Oct-2015 17:36:44
Share email, Google+, Twitter, Facebook.
comments powered by Disqus
Table