简体   繁体   English

如何使PHP的Magic __set像自然变量一样工作?

[英]How do I make PHP's Magic __set work like a natural variable?

Basically, what I want to do is create a class called Variables that uses sessions to store everything in it, allowing me to quickly get and store data that needs to be used throughout the entire site without working directly with sessions. 基本上,我想做的是创建一个名为Variables的类,该类使用会话在其中存储所有内容,从而使我可以快速获取和存储需要在整个站点中使用的数据,而无需直接使用会话。

Right now, my code looks like this: 现在,我的代码如下所示:

<?php
    class Variables
    {
            public function __construct()
            {
                    if(session_id() === "")
                    {
                            session_start();
                    }
            }
            public function __set($name,$value)
            {
                    $_SESSION["Variables"][$name] = $value;
            }
            public function __get($name)
            {
                    return $_SESSION["Variables"][$name];
            }
            public function __isset($name)
            {
                    return isset($_SESSION["Variables"][$name]);
            }
    }

However, when I try to use it like a natural variable, for example... 但是,例如,当我尝试像自然变量一样使用它时...

$tpl = new Variables;
$tpl->test[2] = Moo;
echo($tpl->test[2]);

I end up getting "o" instead of "Moo" as it sets test to be "Moo," completely ignoring the array. 我最终得到“ o”而不是“ Moo”,因为它将测试设置为“ Moo”,完全忽略了数组。 I know I can work around it by doing 我知道我可以通过解决它

$tpl->test = array("Test","Test","Moo");
echo($tpl->test[2]);

but I would like to be able to use it as if it was a natural variable. 但我希望能够像自然变量一样使用它。 Is this possible? 这可能吗?

You'll want to make __get return by reference: 您将要使__get通过引用返回:

<?php
class Variables
{
        public function __construct()
        {
                if(session_id() === "")
                {
                        session_start();
                }
        }
        public function __set($name,$value)
        {
                $_SESSION["Variables"][$name] = $value;
        }
        public function &__get($name)
        {
                return $_SESSION["Variables"][$name];
        }
        public function __isset($name)
        {
                return isset($_SESSION["Variables"][$name]);
        }
}

$tpl = new Variables;
$tpl->test[2] = "Moo";
echo($tpl->test[2]);

Gives "Moo". 给出“ Moo”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM