我试图写一个包装$ _SESSION的简单类。 我的想法是,我能够从引用$ _SESSION变量的类中设置和获取值,让__set和__get执行我需要的其他东西。
我目前所拥有的,远未完成:
class Session
{
// Property declarations
public $data = array();
/**
* Class initialization
*/
public function __construct()
{
if (!session_id()) {
ini_set('session.cookie_lifetime', 0);
ini_set('session.gc-maxlifetime', 0);
session_start();
}
$this->data =& $_SESSION;
}
/**
* Get session ID
* @return string
*/
public function getId()
{
return session_id();
}
}
我试图按照以下方式运作:
$session->images['directory'] = 1;
与
相同$_SESSION['images']['directory'] = 1;
和
echo $session->images['directory'];
应该依次输出:1
问题是,我想使用多维数组,如下所示:
$session->images['foo']['bar'] = 'works';
在SO和php.net的许多示例中提供了常规的__set和__get函数,这不起作用。
当然,在页面重新加载/导航后,我将能够使用各自的值访问相同的变量。
我尝试过的是搜索Google和Stackoverflow,我一直登陆" ArrayAcces",但似乎无法弄清楚如何在我的问题中使用它。
有人指出我正确的方向吗?
答案 0 :(得分:0)
我知道这已经存在了很长一段时间 - 但这是你的答案。
最初我认为你必须使用递归。但后来我记得PHP做了一个引用指针。所以我去查找PHP在线文档中的信息:
http://php.net/manual/en/language.references.php
这导致我尝试了一些事情,我想出了以下内容。现在,我使用in()和out()因为我没有用__set和__get来测试它。我只是想让它发挥作用。所以这里有两个功能:
public function in( $v, $d )
{
$v = $this->get_id( $v );
$a = explode( ".", $v );
$b = &$this->info;
foreach( $a as $k=>$v ){
if( !isset($b[$v]) ){ $b[$v] = array(); $b = &$b[$v]; }
else { $b = &$b[$v]; }
}
$b = $d;
return true;
}
public function out( $v )
{
$v = $this->get_id( $v );
$a = explode( ".", $v );
$b = &$this->info;
foreach( $a as $k=>$v ){
if( isset($b[$v]) ){ $b = &$b[$v]; }
else { return false; }
}
return $b;
}
我用(" this.is.a.test",5)和out(" this.is.a.test")测试了上面的代码。其中产生了以下输出:
In: 1
Out: 5
Array
(
[cleric] => Array
(
[this] => Array
(
[is] => Array
(
[a] => Array
(
[test] => 5
)
)
)
)
)
(是的 - 我正在制作D& D计划以跟踪我的角色。)
我设置了"牧师"的前缀上面我做了IN和OUT功能。所以第一行("牧师")来自前缀。 : - )
无论如何,这比使用递归更快地执行此操作。我希望这有帮助。 :-)或者如果您已经从CakePHP中得到了答案 - 那也很棒! : - )