Вызвать анонимную функцию, блокирующую $ this - PullRequest
4 голосов
/ 14 июня 2011

Я играю с анонимными функциями PHP 5.3 и пытаюсь эмулировать объекты, основанные на прототипах, такие как javascript:

$obj = PrototypeObject::create();

$obj->word = "World";

$obj->prototype(array(
    'say' => function ($ins) {
       echo "Hello {$ins->word}\n";
    }
));

$obj->say();

Это помещает «Hello World», первый параметр является экземпляром класса (как python) но я хочу использовать эту переменную, когда я вызываю функцию, которую я делаю:

$params = array_merge(array($this),$params);
call_user_func_array($this->_members[$order], $params);

И пробую это без результатов:

call_user_func_array($this->_members[$order] use ($this), $params);

Слишком попробуй, в методе __set:

$this->_members[$var] use ($this) = $val;

И

$this->_members[$var] = $val use ($this);

Есть идеи?

1 Ответ

5 голосов
/ 14 июня 2011

Область родительского объекта наследуется use при создании анонимной функции. Поэтому то, что вы пытаетесь сделать, невозможно.

$d = 'bar';

$a = function($b, $c) use ($d)
{
  echo $d; // same $d as in the parent's scope
} 

Возможно, что-то еще, как это то, что вы хотите:

$obj->prototype(array(
    'say' => function () use ($obj) {
       echo "Hello {$obj->word}\n";
    }
));

Но анонимная функция не будет частью класса, и поэтому, даже если вы передадите «$this» в качестве параметра через $obj, она не сможет получить доступ к частным данным объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...