Вызов анонимной функции с указанием $ this

#php #php-5.3

#php #php-5.3

Вопрос:

я играю с анонимными функциями 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), но я хочу использовать переменную this, когда я вызываю функцию, я делаю:

 $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:

Родительская область видимости наследуется 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 , она не сможет получить доступ к личным данным объекта.