Я пытаюсь понять, как далеко я могу зайти с замыканиями / обратными вызовами в PHP5, но в настоящее время я застрял в стеклянном футляре «почему это не работает».
В следующем примере я понимаю, что использование $this
в обратном вызове (особенно при изменении области действия) не будет работать, оно просто показывает, как я надеюсь использовать обратные вызовы / закрытие.
class Customer {
public $name = '';
public $callback = NULL;
function __construct($name) {
$this->name = $name;
}
function when_enters($callback) {
$this->callback = $callback;
}
function enter_store() {
if(is_callable($this->callback))
call_user_func($this->callback);
}
}
class Salesman {
public $customer = NULL;
function add_customer(&$customer) {
$this->customer =& $customer;
$this->customer->when_enters(function() {
$this->greet_customer();
});
}
function greet_customer() {
echo "Hello, {$this->customer->name}!";
}
}
$salesman = new Salesman();
$customer = new Customer('John');
$salesman->add_customer(&$customer);
$customer->enter_store();
Мне удалось воспроизвести эту базовую функцию функционально, реализовав Salesman
как статический класс и установив функцию обратного вызова как Salesman::greet_customer
вместо $this->greet_customer()
.
По сути, я хочу знать ... с помощью экземпляров объектов возможна ли такая функциональность?