Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
class Foo {
public function bar()
{
$foobar = function($someshit) use ($this) {
// ...
}
}
}
class Foo {
protected $foobar;
public function bar()
{
$this->foobar = function($someshit) {
// ..
}
// Выдаст фатал еррор, так как метода foobar у нас в классе нет. А обращатся мы будем к нему ;)
$this->foobar();
// Тут уже будет все отлично и сработает анонимная функция.
$foobar = $this->foobar;
$foobar();
}
}
class Foo {
protected $foobar = function() {
// ...
}
}
class Foo {
function __invoke() {
//..
}
}
$foo = new Foo();
$foo();// вызывается $foo->__invoke();$ php -r 'var_dump(function(){});'
object(Closure)#1 (0) {
}
class Foobar {
function foo(Closure $closure) {
$closure();
}
function bar(SomeSlassWithInvoke $closure) {
$closure();
}
}
Но это совершенно разные механизмы, нет, конечно это и в мануале ихнем написано - что с помощью этой чтуки объект просто прикидываеца функцией. Но вот народ воспринимает это немножко по другому...final class MyClass {
private function __construct(){}
}$bar = 1;
$foo = function($x) use ($bar){
echo $bar."-".$x."\n";
};
$foo(2);// prints 1-2
$foo->__invoke(2);// prints 1-2
PHP, Closures, use & references