2017-05-16 54 views
-2

我想訪問其中一個@_SESSION對象,檢索受保護的數組並訪問數組信息。
在會話對象中檢索數組中的變量PHP

繼承人的對象:

object(Zend\Stdlib\ArrayObject)[271] 
protected 'storage' => 
     array (size=1) 
      'session' => string '[email protected] 0' (length=18) 
protected 'flag' => int 2 
protected 'iteratorClass' => string 'ArrayIterator' (length=13) 
protected 'protectedProperties' => 
    array (size=4) 
     0 => string 'storage' (length=7) 
     1 => string 'flag' (length=4) 
     2 => string 'iteratorClass' (length=13) 
     3 => string 'protectedProperties' (length=19) 

我能夠像這樣訪問會話對象:

$_SESSION['Zend_Auth'] 

但是,當我試圖獲取這樣的信息:

$_SESSION['Zend_Auth']->storage['session'] 

它返回null。 任何幫助表示讚賞!

+1

_「檢索一個受保護的數組」_你不能從對象之外做到這一點 - 這就是保護的意思。 –

+1

也就是說,對象上可能有一個方法可以給你你想要的東西,比如'getSession()'或'getStorage()'... –

+0

我沒有注意到在發佈問題之前,愚蠢的錯誤。 我其實去了zend/stdlib/ArrayObject類,並將存儲改爲公共。 它現在可以工作,但由於不適合更改該類,所以它是一種跛腳修復。 –

回答

1

要訪問受保護的成員,您需要從相同類型(子類型)內訪問它,請參閱visibility (PHP Docs)

class SessionReader extends \Zend\Stdlib\ArrayObject 
{ 
    /** 
    * @return array 
    */ 
    public function access(\Zend\Stdlib\ArrayObject $auth) { 
     return $auth->storage; 
    } 
} 

$reader = new SessionReader(); 
$storage = $reader->access($_SESSION['Zend_Auth']); 
$session = $storage['session']; 

這是一個通用示例,它適用於每個受保護的成員。

在你的情況下,Zend\Stdlib\ArrayObject可能有其他方法來訪問成員(或構件的內部數據),在that case

$session = $_SESSION['Zend_Auth']->getArrayCopy()['session']; 

// or 

$session = $_SESSION['Zend_Auth']['session']; // via ArrayAccess 

訪問這種方式是特定的實現。

+0

你真棒!到底我在找什麼:) –