具有__set和__get的类中的多维数组

时间:2014-10-07 14:31:32

标签: php arrays class session multidimensional-array

我试图写一个包装$ _SESSION的简单类。 我的想法是,我能够从引用$ _SESSION变量的类中设置和获取值,让__set和__get执行我需要的其他东西。

我目前所拥有的,远未完成:

class Session 
{
    // Property declarations
    public $data = array();

    /**
     * Class initialization
     */
    public function __construct() 
    {       
        if (!session_id()) {
            ini_set('session.cookie_lifetime', 0);
            ini_set('session.gc-maxlifetime', 0);

            session_start();
        }

        $this->data =& $_SESSION;
    }

    /**
     * Get session ID
     * @return string 
     */
    public function getId() 
    {
        return session_id();
    }
}

我试图按照以下方式运作:

$session->images['directory'] = 1;

相同
$_SESSION['images']['directory'] = 1;

echo $session->images['directory'];

应该依次输出:1

问题是,我想使用多维数组,如下所示:

$session->images['foo']['bar'] = 'works';

在SO和php.net的许多示例中提供了常规的__set和__get函数,这不起作用。

当然,在页面重新加载/导航后,我将能够使用各自的值访问相同的变量。

我尝试过的是搜索Google和Stackoverflow,我一直登陆" ArrayAcces",但似乎无法弄清楚如何在我的问题中使用它。

有人指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

我知道这已经存在了很长一段时间 - 但这是你的答案。

最初我认为你必须使用递归。但后来我记得PHP做了一个引用指针。所以我去查找PHP在线文档中的信息:

http://php.net/manual/en/language.references.php

这导致我尝试了一些事情,我想出了以下内容。现在,我使用in()和out()因为我没有用__set和__get来测试它。我只是想让它发挥作用。所以这里有两个功能:

public function in( $v, $d )
{
    $v = $this->get_id( $v );
    $a = explode( ".", $v );
    $b = &$this->info;
    foreach( $a as $k=>$v ){
        if( !isset($b[$v]) ){ $b[$v] = array(); $b = &$b[$v]; }
           else { $b = &$b[$v]; }
        }

    $b = $d;
    return true;
}
public function out( $v )
{
    $v = $this->get_id( $v );
    $a = explode( ".", $v );
    $b = &$this->info;
    foreach( $a as $k=>$v ){
        if( isset($b[$v]) ){ $b = &$b[$v]; }
            else { return false; }
        }

    return $b;
}

我用(" this.is.a.test",5)和out(" this.is.a.test")测试了上面的代码。其中产生了以下输出:

In: 1
Out: 5
Array
(
    [cleric] => Array
        (
            [this] => Array
                (
                    [is] => Array
                        (
                            [a] => Array
                                (
                                    [test] => 5
                                )

                        )

                )

        )

)

(是的 - 我正在制作D& D计划以跟踪我的角色。)

我设置了"牧师"的前缀上面我做了IN和OUT功能。所以第一行("牧师")来自前缀。 : - )

无论如何,这比使用递归更快地执行此操作。我希望这有帮助。 :-)或者如果您已经从CakePHP中得到了答案 - 那也很棒! : - )