Волшебный __get() и "сосиска" в несколько свойств Решил тут ознакомиться с интерфейсами обьектов и наткнулся на ArrayAccess и Iterator. Соорудил для интереса класс для работы с БД типа: PHP: <?php $users = new User; foreach ($users as $user){ echo $user->name.' ('.$user->group->name.')<br />'; } Но вот в чём беда, если делать "ленивый" селект из базы, т.е. хватать через __get() свойства и вписывать их по ходу (создавая +1 полупустую итерацию за которую всё хватается и вписывается), то упрёмся в ограниченый __get(). Из цепочки $user->group->name всё можно получить только по одиночке: user, group и name. Это отсосёка та ещё. Как можно получить всю цепочку, я бы сказал, цепищу? P.S. Я делал в __get() "хваталку" отдельным классом и всё шикарно работало за исключением того, что при получении обработанной цепочки (вроде user_group_name) с ней можно делать много чего, но только не return. Вот хз почему, но всё работает, кроме ретурна. P.P.S. Для ознакомления смотрел всякие готовые вещи, но в Kohana, например, метод current() итератора снова и снова создаёт запрос. Т.е. на 20 циклов +20 запросов, а селект в нём *, т.е. всего подряд. Решил "Кохону"-шмохану больше не смотреть.
не понял в чем трабла. что занчит по одиночке? что за ограниченый __get()? почему не работает ретурн???
Ночью писал, когда мозг уже сгорел. Есть сосиська: $user->group->name. Каждый из свойст класса это необьявленное свойство, которое ловится через магический метод __get(). Через __get() класса $user она хватается, но хватается кусками как: group и как name, но не как group->name или group['name']. Если делать в __get() return $this, то сосиську можно отловить, но не так как надо. Если делать return с отдельным классо (специальный для отлова), то сосиска ловится и формируется, как надо. Но. Но return полученой и отформированной из друго класса нельзя сделать return из текущей __get(). Можно echo, var_dump(), в массив запихать и будет работать. Но не return. Ни в каком виде return не делается. Я даже через ob_start() ловил, но до return строка тупо не доходит, теряется где-то. Вот такая вот загвоздка. Проверил на пхп 5.2.4 и 5.2.6 не ретурнит хоть тресни. Вооот.
Ыыы, даже телепат подкочал. Мысли в кучку у меня. PHP: <?php class User extends SQL { // пустой, тока связи описаны и окаканы } class SQL_vars { public $get; function __get($name){ $this->get[] = $name; } // тут функция формирования из полученых переменных в _строку_ нужного вида } class SQL { // тут рабочии переменные, чтобы в __get() не лезли function __construct($name){ $this->vars = new SQL_vars; } function __get($name){ $this->vars->$name; return $this->vars; } } Так вот, return $this->vars не работает. С ней можно сделать var_dump($this->vars), echo $this->vars или в массив запихать как ключ или значение или иную белеберду, но не return. Вопрос. Почему, блин?
lexa Давай полный код этих классов, вместе подумаем. У меня следующая конструкция работает как и ожидается. PHP: <?php class User extends SQL { // пустой, тока связи описаны и окаканы } class SQL_vars { public $get; function __get($name){ return $this->get[$name]; } function __set($name, $value){ $this->get[$name] = $value; } // тут функция формирования из полученых переменных в _строку_ нужного вида } class SQL { // тут рабочии переменные, чтобы в __get() не лезли private $vars; function __construct(){ $this->vars = new SQL_vars; } function __get($name){ return $this->vars->$name; } function __set($name, $value){ $this->vars->__set($name, $value); } } $user = new User('fuck'); $user->group = 'Guest'; var_dump($user->group); // Guest
Мм, код целый дать не могу, его уже нет. Я переделал позавчера "ленивую" загрузку сделал не через пустую итерацию, а тупо подлючаем (джойним, т.е.) то, что есть в селектах, ордере и прочем. Получилось шикарная надстройка над DbSimple. Неожиданно как-то вылупилось. Потом куда-нить сюда выложу показать. SQL_vars::__get() у меня каждое второе вхождение возвращал как строку, а каждое первое как $this. Ладно, не важно. Спасибо за попытку разобраться.