Search code examples
phpclassfunctionmethodsclosures

Storing a Closure Function in a Class Property in PHP


ok I do have the code below

<?php
    class foo{
       public $bar = NULL;

       public function boo(){
          $this->bar();
       }
    }

    $mee = new foo();

    //save a closure function on the property
    $mee->bar = function(){
        echo 'hahaha';
    };

    //invoke the closure function by using a class method
    $mee->boo();
?>

and you can see it running here http://codepad.org/s1jhi7cv

now what i want here is to store the closure function on the class method.

well closures are possible as i read the documentation about it here http://php.net/manual/en/functions.anonymous.php

is this possible? did i went to something wrong? please correct me


Solution

  • Your example code at codepad.org does not work because codepad.org uses PHP 5.2.5, and closure support was only added in 5.3.

    However, your code will also not work in a PHP version that supports closures, although you will get a different error: http://codepad.viper-7.com/Ob0bH5

    This is a limitation of PHP at present. $obj->member() looks for a method named member and will not look at properties to see if they are callable. It is, frankly, annoying.

    The only way I am aware of to make this work without call_user_func()/call_user_func_array() is:

    public function boo() {
       $func = $this->bar;
       $func();
    }