我有一个$_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 的小链接