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


Session wrapper class. Set multi dimensional array

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

过去有一个简单的是可以的

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

但现在我正在实现一个购物服务,它有一个购物车,当用户向购物车添加商品时,它会将其设置为$_SESSION['cart'][$productId],它保存数量,这样你就可以看到我的get()set()的分解。

我目前在我的新get()中有这个

/*
 * @args: ...
 * @return: mixed
 */
public function get() {
    $keys = func_get_args();
    $value = $_SESSION[array_shift($keys)];
    foreach( $keys as $key ) {
        $value = $value[$key];
    }
    return $value;
}
// This is how I use it then
$quantity = $session->get('cart', $productId);

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

现在的问题是set()方法。我想用类似的方式来做,这样就可以在方法的签名中给出任意数量的密钥,然后再存储值,但事实证明,这对我来说非常困惑。

有人知道如何做到这一点吗?

谢谢。

这应该有效:

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'

还有一个来自php.net 的小链接