我正在尝试通过匿名函数转储对象私有属性的元素 - 当然我可以通过许多其他方式实现这一点,但这突出了一个我无法解决的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();
答案 0 :(得分:3)
我相信绝对没有办法直接做你的建议。
但是,您可以通过将匿名方法设为类方法(这不是您要求的,但它可能是一个实用的解决方案)或者明确地从$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);
}
}
答案 1 :(得分:3)
您可以通过创建使用Reflection的包装器来解决限制,以允许您访问所有属性和方法。您可以像这样使用它:
$self = new FullAccessWrapper($this);
function () use ($self) { /* ... */ }
这是包装器的示例实现,取自here:
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);
}
}
显然,上述实现并未涵盖所有方面(例如,它不能使用魔法属性和方法)。
答案 2 :(得分:1)
正如你自己所说,它是私密的,因此可以访问。
你可以: