我有一个我的$_SESSION
数组的包装器类,因为我喜欢使用对象,它可以防止我变得懒惰并从我不应该的地方调用超级全局。
过去很简单:
public function get($name);
public function set($name, $value);
public function exists($name);
......
但现在我正在实施一个购物服务并且它有一个购物车,当用户将一个项目添加到购物车时,它将其设置为$_SESSION['cart'][$productId]
,其中包含数量,以便您可以看到我的{{1} }和get()
分解。
我目前有这个用于我的新get()
set()
它完美地假设搜索的键确实存在,否则它会给我一个警告。
现在的问题是set()方法。我想以类似的方式做到这一点,因此可以在方法的签名中给出任意数量的键,然后存储值,但无论如何它对我来说都是非常混乱。
有谁知道如何做到这一点?
感谢。
答案 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'