2017-08-22 16 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

この警告を避けるには、2つの新しいオブジェクトを作成する必要があります。 PHPは自動的にオブジェクトを作成しますが、この警告が表示されます。ですから、あなたは単に次のようにすることができます: '$ session-> car = new stdClass(); $ session-> car-> Fiat =新しいstdClass(); – naklar

+0

私は '__set($ name、$ value)をネストする必要があることを知りました {$ this-> $ name- $ this-> arrayToObject $ session-> car-> status =" crashed " {$ this-> {$ name} = new stdClass();} $ { - } {$ name} } $ this - > {$ name}を返します。 } 'を各stdClass()に渡します。 – Bejkrools

関連する問題