2017-08-22 67 views
0

我想強制$ _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

只是做

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

避免此警告。

+0

謝謝,我們離解決方案有一點距離,但是如何做到「即時」?有時我想運行'$ session-> car-> Fiat_500-> status ='crashed';'這完全是「新」路徑 – Bejkrools

+0

然後,您將不得不創建兩個新對象,以避免此警告。 PHP自己默默地創建對象,但有了這個警告。所以你可以這樣做:'$ session-> car = new stdClass(); $ session-> car-> Fiat = new stdClass(); $ session-> car-> Fiat-> status =「crashed」;' – naklar

+0

我發現我需要嵌套'__set($ name,$ value) {$ this - > $ name = $ this-> arrayToObject ($ value);}'和__get($ name){if(!isset($ this - > {$ name})){$ this - > {$ name} = new stdClass(); } return $ this - > {$ name}; }'到每個stdClass()。 – Bejkrools