Я пытаюсь сбрасывать элементы частной собственности объекта через анонимную функцию – конечно, я мог бы достичь этого любым другим способом, но это подчеркивает загадку 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();
Я считаю, что абсолютно невозможно напрямую сделать то, что вы предлагаете.
Однако вы можете обойти это, сделав анонимный метод классом (это не то, что вы просили, но это может быть практическое решение) или вытащить все, что вам нужно, из $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); } }
Очевидно, что приведенная выше реализация не охватывает все аспекты (например, она не может использовать магические свойства и методы).
Как вы сами сказали, он является частным и, следовательно, доступен.
Ты можешь: