[英]Accessing private/protected properties of an object in anonymous function in 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();
我相信絕對沒有辦法直接做你的建議。
但是,您可以通過將匿名方法設置為類方法(這不是您要求的,但它可能是一個實用的解決方案)或者明確地從$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);
}
}
顯然,上述實現並未涵蓋所有方面(例如,它不能使用魔法屬性和方法)。
正如你自己所說,它是私人的,因此是可訪問的。
您可以:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.