会话处理程序的行为类似于对象

时间:2017-08-22 11:29:24

标签: php session object warnings

我想使用自定义会话处理程序强制$ _SESSION表现得像对象一样。代码如下,

$_SESSION = [
'user' => [
    'id' => '7',
    'name' => 'James',
    'lastname' => 'Bond',
    'login' => '007',
    'pass' => 'qwe7fyqw9mhev8qhr',
],
'kill' => [
    'Mr_Muscle' => [
        'status' => 'alive',
    ],
    'Joe_Black' => [
        'status' => 'dead',
    ]
],
];

$session = new Session();

echo $session->user->name;

$session->kill->Mr_muscle->status = 'dead';

$session->save();

我几乎做到了,但我收到了警告:

  

警告:在第80行的/var/www/project/mvc/bootstrap.php中从空值创建默认对象

当我尝试创建新值时,在这种情况下:

$session->kill->Dr_Quinn->status = 'dead';

将创建值,但我不想隐藏此警告,我想废除它。

class Session
{
    public function __construct()
    {
        foreach ($_SESSION as $key => $value)
        {
            $this->{$key} = $value;
        }
    }

    public function __set($name, $value)
    {
        $this->$name = $this->arrayToObject($value);
    }

    private function arrayToObject($array) {
        if (!is_array($array)) {
            return $array;
        }

        $object = new stdClass();
        if (is_array($array) && count($array) > 0) {
            foreach ($array as $name=>$value) {
                $name = strtolower(trim($name));
                if (!empty($name)) {
                    $object->$name = $this->arrayToObject($value);
                }
            }
            return $object;
        }
        else {
            return FALSE;
        }
    }

    public function save()
    {
        $_SESSION = json_decode(json_encode(get_object_vars($this)), true);
    }

如何解决?

1 个答案:

答案 0 :(得分:1)

只做

if (!isset($session->kill->Mr_muscle)) 
    $session->kill->Mr_muscle = new stdClass();
$session->kill->Mr_muscle->status = 'dead';

避免这种警告。