2010-05-15 4 views
0

В принципе, я хочу создать класс Variables, который использует сеансы для хранения всего в нем, что позволяет мне быстро получать и хранить данные, которые должны использоваться на всем сайте, без непосредственной работы с сеансами.Как заставить PHP __set работать как естественная переменная?

Прямо сейчас, мой код выглядит следующим образом:

<?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]); 

Я в конечном итоге получить " o "вместо" Moo ", поскольку он устанавливает тест как« Moo », полностью игнорируя массив. Я знаю, что могу обойти это, сделав

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

, но я хотел бы иметь возможность использовать его, как если бы это была естественная переменная. Это возможно?

+2

Вы можете использовать переменную $ _SESSION напрямую. Во всяком случае, я не понимаю. Что такое $ tpl-> test [2] = Moo; должен делать? Является ли Moo постоянной? Если это строка, ей не хватает кавычек. – Artefacto

+0

В чем смысл? $ _SESSION уже является переменной ... – nico

+0

@nico Говоря о будущем, это отлично подходит для таких вещей, как инъекция зависимостей и просто абстракция. Некоторые люди могут предпочесть использовать Session как объект или синглтон. – Navarr

ответ

4

Вы хотите сделать __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]); 

дает "Moo".

+0

Я не думал, что вы можете перегрузить __get/set с помощью ссылочного оператора ... – prodigitalson

+1

На самом деле вы должны перегрузить __get. В противном случае вы получите сообщение. Непрямая модификация перегруженного свойства. Variables :: $ test не влияет. Когда вы используете $ tpl-> test [2] = «Moo»; фактический обработчик, который вызывается, не является __set; это __get. Вы не говорите: «Храните в $ tpl-> test массив (2 =>« Moo »), вы говорите:« Измените тестовый массив $ tpl-> так, чтобы это было 2 ключевых карты со значением «Moo». Для этого вам нужно вызвать __get, а __get нужно вернуть по ссылке. Вы можете подумать, что это можно сделать с помощью пары __get/__ set, но почему это невозможно, это не соответствует этому комментарию. – Artefacto