В пхп, доброе-утро, появились анонимные функции. И заодно замыкания. Про синтаксис замыканий я, пожалуй, говорить ничего не буду, а то прийдётся ругаться, но вот анонимные решают.
Например, можно присвоить некой переменной анонимную функцию, положить её в массив и вызвать. А вот положить её в свойство объекта её положить уже нельзя:
$f = function($a) { return 5 + $a; }; // Не забываем везде ставить ; !!!!!11
var_dump(gettype($f)); // string(6) "object"
var_dump($f(5)); // int(10)
$a = array($f);
var_dump(gettype($a)); // string(5) "array"
var_dump(gettype($a[0])); // string(6) "object"
var_dump($a[0](5)); // int(10)
$o = new stdClass();
$o->f = $f;
var_dump(gettype($o)); // string(6) "object"
var_dump(gettype($o->f)); // string(6) "object"
var_dump($o->f(5)); // Fatal error: Call to undefined method stdClass::f()
Но данное ограничение легко обходится простым, прости-боже за такие слова, снипплетом:
var_dump(call_user_func(function($object_vars, $var_name, $param) { return $object_vars[$var_name]($param); }, get_object_vars($o), 'f', 5)); // int(10)
2013.01.21 00:04