Как заставить PHP Magic __set работать как естественная переменная?
По сути, я хочу создать класс с именем Variables, который использует сеансы для хранения всего, что в нем, что позволяет мне быстро получать и хранить данные, которые необходимо использовать по всему сайту, без непосредственной работы с сеансами.
Прямо сейчас мой код выглядит так:
<?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]);
но я хотел бы иметь возможность использовать его как естественную переменную. Это возможно?
1 ответ
Решение
Вы хотите, чтобы __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]);
Дает "Му".