Я пытаюсь играть с php5.3 и закрытием.определить замыкание как метод из класса
Я вижу здесь (листинг 7. Закрытие внутри объекта: http://www.ibm.com/developerworks/opensource/library/os-php-5.3new2/index.html), что в функции обратного вызова можно использовать $ this, но это не так. Поэтому я стараюсь, чтобы дать $ это как переменная использования:
$self = $this;
$foo = function() use($self) { //do something with $self }
Так, чтобы использовать тот же самый пример:
class Dog
{
private $_name;
protected $_color;
public function __construct($name, $color)
{
$this->_name = $name;
$this->_color = $color;
}
public function greet($greeting)
{
$self = $this;
return function() use ($greeting, $self) {
echo "$greeting, I am a {$self->_color} dog named {$self->_name}.";
};
}
}
$dog = new Dog("Rover","red");
$dog->greet("Hello");
Output:
Hello, I am a red dog named Rover.
Прежде всего этого примера не печатает строку, а возвращает функцию, но это не моя проблема.
Во-вторых, я не могу получить доступ к частным или защищенным, так как функция обратного вызова является глобальной функцией, а не контекстом объекта Dog. Это моя проблема. Это то же самое, как:
function greet($greeting, $object) {
echo "$greeting, I am a {$self->_color} dog named {$self->_name}.";
}
И я хочу:
public function greet($greeting) {
echo "$greeting, I am a {$self->_color} dog named {$self->_name}.";
}
Который из собаки и не глобальные.
Нет, я не понял, что вы хотите. Если приветствие - это метод, видимость деактивируется публично, поэтому ваши два последних блока кода эквивалентны. – Artefacto
Эта волшебная инъекция '$ this' в clojure была отброшена до того, как был выпущен PHP 5.3. Фактически, это было отложено для предстоящей версии PHP. Там будет что-то вроде 'Closure :: bindTo', которое можно использовать для привязки объектов как контекстов к лямбда. –