簡體   English   中英

在PHP中訪問匿名函數中對象的私有/受保護屬性

[英]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);
    }
}

顯然,上述實現並未涵蓋所有方面(例如,它不能使用魔法屬性和方法)。

正如你自己所說,它是私人的,因此是可訪問的。

您可以:

  • 將$ this-> payload作為參數傳遞給匿名函數。
  • 在類中創建一個方法,然后使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM