Доступ к частным / защищенным свойствам объекта в анонимной функции в PHP

Я пытаюсь сбрасывать элементы частной собственности объекта через анонимную функцию – конечно, я мог бы достичь этого любым другим способом, но это подчеркивает загадку PHP, которую я не могу решить с головы до головы, $ foo = $ this и используя $ foo – но это не даст мне личные вещи, поэтому … предложения?

Образец кода:

class MyClass { private $payload = Array( 'a' => 'A element', 'b' => 'B element'); static $csvOrder = Array('b','a'); public function toCSV(){ $values = array_map( function($name) use ($this) { return $this->payload[$name]; }, self::$csvOrder ); return implode(',',$values); } } $mc = new MyClass(); print $mc->toCSV(); 

Solutions Collecting From Web of "Доступ к частным / защищенным свойствам объекта в анонимной функции в PHP"

Я считаю, что абсолютно невозможно напрямую сделать то, что вы предлагаете.

Однако вы можете обойти это, сделав анонимный метод классом (это не то, что вы просили, но это может быть практическое решение) или вытащить все, что вам нужно, из $this явно и передать извлеченные значения в функция:

 class MyClass { private $payload = Array( 'a' => 'A element', 'b' => 'B element'); static $csvOrder = Array('b','a'); public function toCSV(){ $payload = $this->payload; $values = array_map( function($name) use ($payload) { return $payload[$name]; }, self::$csvOrder ); return implode(',',$values); } } 

Вы можете взломать ограничение, создав оболочку, которая использует 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); } } 

Очевидно, что приведенная выше реализация не охватывает все аспекты (например, она не может использовать магические свойства и методы).

Как вы сами сказали, он является частным и, следовательно, доступен.

Ты можешь:

  • Передайте $ this-> полезную нагрузку в качестве параметра анонимной функции.
  • Создайте метод в классе и используйте его вместо этого.