Първо нека си припомним какво е callback function.
Callback function is any reference to executable code that is passed as an argument to another piece of code.
Демек, код който се предава на друг код, под формата на аргумент, за да бъде изпълнен.
А относно статични и динамични callbacks, имаме две положения:
DYNAMIC Anonymous Functions
Когато имаме анонимна функция В КЛАС, това значи че $this променливата e ДОСТЪПНА в тази анонимна функция, демек става част от скоупа му, защото „the default behavior is that the class is automatically bound to the closure“.
Eто следният пример:
<?php class Foo { public function bar(): \Closure { return function (): void { var_dump($this); }; } } $foo = new Foo(); $foo->bar()();
Първо, кой е callback-ът в даденият пример? Това е методът bar(). Защо? Защото какво връща той? Връща код, не конкретна стойност. Който код, може да бъде предаден като аргумент на друг код.
Второ, var_dump()-ът ще дъмпне самият обект – object(Foo)#1 (0) {}
Което очевидно значи, че щом даденият callback е динамичен то за всеки обект от класа Foo, ще имаме достъп до обектната променлива ($this), указваща към този даден обект, в който сме към даденият момент.
Static Anonymous Functions
Нека разгледаме горният код, но с една малка разлика – callback функцията нека е статична.
<?php class Foo { public function bar(): \Closure { return static function (): void { var_dump($this); }; } } $foo = new Foo(); $foo->bar()();
Ще имаме Fatal error: Uncaught Error: Using $this when not in object context…
Вече, ако имаме статично пропърти на класа или статичен метод, можем да го достъпим, но чрез self
<?php
class Foo
{
private static string $a = 'Hello world';
public static function bar(): \Closure
{
return static function (): void {
var_dump(self::$a);
};
}
}
$foo = new Foo();
$foo->bar()(); // Hello world
Литература:
https://en.wikipedia.org/wiki/Callback_(computer_programming)
https://www.designcise.com/web/tutorial/what-are-static-anonymous-functions-in-php