Вы можете обойти ограничение, создав оболочку, которая использует Reflection, чтобы позволить вам получить доступ ко всем свойствам и методам. Вы можете использовать его следующим образом:
$self = new FullAccessWrapper($this);
function () use ($self) { /* ... */ }
Вот пример реализации оболочки, взятой из здесь :
class FullAccessWrapper
{
protected $_self;
protected $_refl;
public function __construct($self)
{
$this->_self = $self;
$this->_refl = new ReflectionObject($self);
}
public function __call($method, $args)
{
$mrefl = $this->_refl->getMethod($method);
$mrefl->setAccessible(true);
return $mrefl->invokeArgs($this->_self, $args);
}
public function __set($name, $value)
{
$prefl = $this->_refl->getProperty($name);
$prefl->setAccessible(true);
$prefl->setValue($this->_self, $value);
}
public function __get($name)
{
$prefl = $this->_refl->getProperty($name);
$prefl->setAccessible(true);
return $prefl->getValue($this->_self);
}
public function __isset($name)
{
$value = $this->__get($name);
return isset($value);
}
}
Очевидно, что приведенная выше реализация не охватывает все аспекты (например, она не может использовать магические свойства и методы).