Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
$cache = new Cache\Memcache;
return $cache(function() use ($conditions) {
return SomeModel::findAll($conditions)
}, 600);
$uploader = new Http\Uploader();
$fileName = $uploader('image');
Наконец, чем хуже $cache->get(function() {})
$getBlock = function () use ($template, $route) {
$controller = $this->createController($route->module, $route->controller);
$controller->action($route->action, $route->params);
return $controller->view->render(
$route->action . (!empty($template) ? '.' . $template : '') . '.block.html',
$controller->getData()
);
};
if (!empty($blockOptions['cache'])) {
$cache = new Cache();
$key = md5($canonicalPath . serialize($route->params) . $template);
if (!empty($blockOptions['cache']['time'])) {
return $cache($key, $getBlock, $blockOptions['cache']['time']);
} else {
return $cache($key, $getBlock);
}
} else {
return $getBlock();
}
$x = function () {
print(1);
};
if ($x instanceof \Closure) {
call_user_func($x);
}
$x instanceof \Closure
не проверяет является ли переменная функцией. Она проверяет является ли переменная анонимной функцией.<?php
$x = function() {
};
$y = 'trim';
var_dump($x instanceof Closure); // true
var_dump($y instanceof Closure); // false
var_dump(is_callable($x)); // true
var_dump(is_callable($y)); // true
callable vs callback
<?php
class a {
public function __call($foo, $arguments) {}
public static function __callStatic($foo, $arguments) {}
}
$obj = new a();
var_dump(is_callable('a::bar')); // bool(true)
var_dump(is_callable([$obj, 'baz'])); // bool(true)
"Baz::foo"
всё остальное callable работает безо всяких call_user_func
:class Baz
{
static function foo () { return 'foo'; }
function bar () { return 'bar'; }
function __invoke() { return 'baz'; }
}
function foo () { return 'foo'; }
$foo = new Baz;
$f = 'foo';
assert($f() == 'foo');
$f = [ Baz::class, 'foo' ];
assert($f() == 'foo');
$f = [ 'Baz', 'foo' ];
assert($f() == 'foo');
$f = [ $foo, 'bar' ];
assert($f() == 'bar');
$f = $foo;
assert($f() == 'baz');
// Fatal error: Call to undefined function Baz::foo()
//$f = 'Baz::foo';
//assert($f() == 'foo');
<?php
class a{
function b () {
echo 'b';
}
}
$a = new a();
[$a, 'b']();
[]()
в костыль-дривен парсере не поддерживается. Вот так работать будет:$f = [$a, 'b'];
$f();
($this->a)()
, тоже приходится писать в две строчки (в PHP 5.5, по крайней мере).Дело в том, что на самом деле create_function() не создавала лямбда-функцию в современном понимании, фактически эта функция создавала именованную функцию с именем наподобие «lambda_1» и возвращала ее имя.Не совсем так. Чтобы эти имена не пересекались с создаваемыми через обычный function, авторы языка первым символом поставили символ с кодом ноль:
var_dump(ord(create_function("",""))); // 0
Готовимся к собеседованию по PHP: псевдотип «callable»