会话包装类。设置多维数组

时间:2013-07-20 09:47:05

标签: php

我有一个我的$_SESSION数组的包装器类,因为我喜欢使用对象,它可以防止我变得懒惰并从我不应该的地方调用超级全局。

过去很简单:

public function get($name);
public function set($name, $value);
public function exists($name);
......

但现在我正在实施一个购物服务并且它有一个购物车,当用户将一个项目添加到购物车时,它将其设置为$_SESSION['cart'][$productId],其中包含数量,以便您可以看到我的{{1} }和get()分解。

我目前有这个用于我的新get()

set()

它完美地假设搜索的键确实存在,否则它会给我一个警告。

现在的问题是set()方法。我想以类似的方式做到这一点,因此可以在方法的签名中给出任意数量的键,然后存储值,但无论如何它对我来说都是非常混乱。

有谁知道如何做到这一点?

感谢。

1 个答案:

答案 0 :(得分:1)

这应该有效:

class Session{
    // $...
    public function get(){
        $keys = func_get_args();

        if(count($keys) < 1){
            // handle exception
        }

        $value = $_SESSION[array_shift($keys)];

        foreach($keys as $key){
            if(!isset($value[$key])){
                // handle exception
            }

            $value = $value[$key];
        }

        return $value;
    }

    // $valueToSet, $...
    public function set(){
        $data = func_get_args();

        if(count($data) < 2){
            // handle exception
        }

        $val = array_shift($data);

        $value = &$_SESSION[array_shift($data)];

        foreach($data as $key){
            if(!isset($value[$key])){
                $value[$key] = array();
            }

            $value = &$value[$key];
        }

        $value = $val;
    }

    // $...
    public function exists(){
        $keys = func_get_args();

        if(count($keys) < 1){
            // handle exception
        }

        $tmp = array_shift($keys);

        if(!isset($_SESSION[$tmp])) return false;
        $value = $_SESSION[$tmp];

        foreach($keys as $key){
            if(!isset($value[$key])){
                return false;
            }

            $value = $value[$key];
        }

        return true;
    }
}

我可以给你一个小例子:

$var = 'asdf';
$var_copy = $var;
$var_copy2 = &$var;

$var_copy = 'asdf2';
echo $var; // prints 'asdf'

$var_copy2 = 'asdf2';
echo $var; // prints 'asdf2'

还有一点link from php.net