2017-05-16 55 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

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