![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
упрощенный пример:
т.е. задаем(и сохраняем) атрибут через __set проблема в том, что $_var ($var) должна работать как массив, а при таком варианте возникает ошибка как реализовать подобный вариант(когда-то пробовал через ArrayObject, но не получилось) и вообще есть ли какой-то способ отлавливать вызов методов и изменение атрибутов также как и с ошибочными вариантами? |
|||
|
||||
Arantir |
|
|||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 2 Всего: 55 |
На вид какая-то странная смесь модели и контроллера. Может в этом проблема (в неправильном подходе/архитектуре)?
Почему не сделать вот так
-------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
||||
|
||||
awdev |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 22.11.2009 Репутация: нет Всего: 1 |
Результат:
|
||||
|
|||||
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
awdev пасиб за старания, но это не то: представь, что кроме $_vars еще 10 таких атрибутов, кроме этого атрибут должен работать как массив т.е. $c->a[4]=2;
|
|||
|
||||
krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 1 Всего: 69 |
Это самый простой пример. В идеале надо реализовать через паттерн наблюдатель, а то мало ли вдруг несколько приемников будет у события. Это сообщение отредактировал(а) krundetz - 3.6.2013, 09:35 |
|||
|
||||
Чучмек |
|
|||
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: нет Всего: 41 |
-------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
krundetz> я писал уже может быть не только $_var, но и $_var2 и т.д.
Чучмек> тоже не то т.к. определенный индекс массива нельзя задать |
|||
|
||||
Чучмек |
|
|||
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: нет Всего: 41 |
То, не то. Гадание на кофейной гуще.
Насколько понятен вопрос - настолько точен ответ. Что ты хочешь контролировать? Добавление свойств в объект? Контролировать конкретное свойство(а)? Контролировать вставляемые ключ=>значение в свойство-массив? -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
Arantir |
|
|||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 2 Всего: 55 |
Кажись наконец-то доперло...
ТС хочет отлавливать вот такое:
Это сообщение отредактировал(а) Arantir - 3.6.2013, 18:55 -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
Arantir |
|
||||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 2 Всего: 55 |
Проблема в том, что изменения массива надо отслеживать в классе объекта массива, а не в классе, где этот объект является простым полем.
придется свой массив создавать:
Это сообщение отредактировал(а) Arantir - 3.6.2013, 19:28 -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||
|
|||||
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
вопрос задан нормально, ArrayObject вам не известен судя по постам хоть я его и упоминал. вопрос адресован прежде всего профессионалам, был бы он настолько прост я бы его вообще не задал.
Это сообщение отредактировал(а) ShamanVoodoo - 3.6.2013, 22:30 |
|||
|
||||
Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 1 Всего: 42 |
Нас звали? Мы пришли. Постарайтесь задать вопрос, а не выдавать поток бессвязного бреда как в первом сообщении, тогда получите ответ. Hint: чтобы свойство реагировало как массив оно должно реализовывать интерфейс массива, что вам и показали в предыдущем примере. А уж как вы будете реализовывать - это ваши половые трудности. -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
awdev |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 22.11.2009 Репутация: нет Всего: 1 |
Вот такой ###код получился.. разгребай
![]()
Вывод:
То есть можно использовать много псевдо переменных: $c->foo[1]=1; $c->bar[2]=2; при этом вызывается метод SAVE при новом значении, ну и функции так же через жопу но можно проследить. вызывается __call |
||||
|
|||||
Arantir |
|
||||||||||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 2 Всего: 55 |
Черт, даже зарабатывать этим на жизнь уже недостаточно, чтобы это можно было назвать своей профессией
![]()
ArrayObject как раз таки ArrayAccess и реализует, на который в первую очередь PHP и опирается при определении корректности использования квадратных скобочек на объект. Остальное в нем — это свистели и переделки массива как такового, вроде сортировки. Если они Вам нужны — пожалуйста, реализовывайте, никто же не запрещает. Вы дали понять только то, что хотите отловить момент изменения элемента массива. Для этого достаточно ArrayAccess. Создавать свой класс для массива придется в любом случае, иначе впихнуть ивент будет просто некуда. Если Вам хочется вынести ивент в класс Controller, то это делается несложно:
-------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||||||||
|
|||||||||||
krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 1 Всего: 69 |
Вы попросили, люди вам добровольно помогли так как вас поняли, если вы видите, что они поняли вас не так, потрудитесь это до них донести корректно, а не брызгать слюной высказывая упреки. - вам за это. |
|||
|
||||
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
Fortop, Arantir спасибо, а Вам awdev отдельное
![]() и вообще есть ли какой-то способ отлавливать вызов методов и изменение атрибутов также как и с ошибочными вариантами? если с методами и observer еще все более менее ясно, то вот как с атрибутами быть не ясно |
|||
|
||||
Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 1 Всего: 42 |
не работать с атрибутами работать с ними только через геттеры/сеттеры. пусть даже и магические __get/__set -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 1 Всего: 69 |
на прямую из вне класса сделать все отслеживаемые атрибуты private или protected
магические могут быть в некоторых ситуациях даже более удобными, да и количество кода сократиться изменение атрибутов внутри класса отслеживать придется ручками и событие ручками иниицровать. |
|||
|
||||
awdev |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 22.11.2009 Репутация: нет Всего: 1 |
А чем мой вариант не подходит для этих задач? вызывается события как для атрибутов так и для методов.
|
|||
|
||||
ShamanVoodoo |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
для первой части он лучше всего подходит, но там еще есть под вопрос:
все эти танцы с бубном для того, чтобы отлавливать ВСЕ переменные\методы, как верные так и нет. т.е.
я никак не могу понять можно ли обойти это как-то непосредственно в коде или решаемо только на уровне своей библиотеки для php |
||||||
|
|||||||
awdev |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 22.11.2009 Репутация: нет Всего: 1 |
На SO Предплагают такой вариант http://stackoverflow.com/questions/5891463...getters-setters
некая эмуляция гетерс-сетерс... Добавлено через 1 минуту и 35 секунд http://habrahabr.ru/post/39338/ |
|||
|
||||
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
все это дело буксует при попытке работать с переменной как с многомерным массивом, но возможно я слишком многого хочу.
а по поводу использования паттерна наблюдатель, то лучше реализовывать его на базе SPL:
сейчас как раз пример модернизуриую под это |
|||
|
||||
Fortop |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 1 Всего: 42 |
Чтобы с ней работать как с многомерным массивом она должна быть им! Будут ли использоваться стандартные массивы пхп для этого или реализуется некий Value объект разрешающий доступ к себе как к массиву - это неважно Важно что каждый элемент должен работать как массив такое вполне реализуемо
Впрочем обычно и бессмысленно в случае с пхп. -------------------- Мир это Я. Живее всех живых. |
||||
|
|||||
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
Fortop>
в случае
уже работать не будет, ваш вариант я реализовывал, но как только уходишь от одномерных массивов сразу начинаются сложности =\ |
|||
|
||||
Fortop |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 1 Всего: 42 |
Слушайте, не рассказывайте мне сказок....
Вывод с небольшой отладкой
-------------------- Мир это Я. Живее всех живых. |
||||
|
|||||
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
Fortop> код можно увидеть?
|
|||
|
||||
Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 1 Всего: 42 |
Использовать его в работе нельзя.
Он с ошибками! Написан всего лишь для демонстрации принципа
-------------------- Мир это Я. Живее всех живых. |
|||
|
||||
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
Fortop> спасибо, про такой вариант гет'а как-то не додумался, пойду дальше пилить в сторону count и работы с циклами
|
|||
|
||||
awdev |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 22.11.2009 Репутация: нет Всего: 1 |
Странный ТС, то ему нужны переменные внутри класса как массивы, то теперь чтоб объект класса мог быть тоже массивом
![]() ![]() |
|||
|
||||
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
awdev> у меня объект - контроллер, некоторые из свойств которого должны содержать другие объекты, реализующие работу с данными. для простоты хочется работать с ними как с обычными массивами, но бекэндом должны еще доп действия над этими данными выполняться, поэтому просто массивы использовать нельзя.
|
|||
|
||||
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
допилил вариант Fortop'a , осталась одна проблема: когда задаем $c[1][2][3] = 3; в set offset = 3, соответсвенно невозможно понять какое именно значение было перезаписано, никак не придумаю как получить текущее положение [1][2][3] чтобы не переписывать все значения сессии, а только конкретный элемент [1][2][3] . Можно просто идею, остальное сам доведу до ума.
Это сообщение отредактировал(а) ShamanVoodoo - 24.6.2013, 17:15 |
|||
|
||||
Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 1 Всего: 42 |
Ужас. Вопрос не вопрос и понять его....
Какое значение? Кем было перезаписано? Храните в объекте ссылку/адрес родителя. Она же будет вашим текущим положением. -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
Fortop, по русски это хрен объяснишь... да, что-то вроде идентификаторов делать по видимому придется или флаги изменения состояния на крайний случай и потом делать поиск по массиву на предмет поднятых флагов
![]() |
|||
|
||||
krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 1 Всего: 69 |
![]() |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Для профи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |