1

我的$_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() 方法。我想以类似的方式执行此操作,因此可以在方法的签名中给出任意数量的密钥,然后给出要存储的值,但事实证明无论如何这对我来说非常混乱。

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

谢谢。

4

1 回答 1

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'

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

于 2013-07-20T10:14:33.887 回答