Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Событие при изменении атрибута объекта 
:(
    Опции темы
krundetz
Дата 4.6.2013, 12:29 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



Цитата(ShamanVoodoo @  3.6.2013,  22:28 Найти цитируемый пост)
вопрос задан нормально, ArrayObject  вам не известен судя по постам хоть я его и упоминал. вопрос адресован прежде всего профессионалам, был бы он настолько прост я бы его вообще не задал.

Вы попросили, люди вам добровольно помогли так как вас поняли, если вы видите, что они поняли вас не так, потрудитесь это до них донести корректно, а не брызгать слюной высказывая упреки. - вам за это.


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
ShamanVoodoo
Дата 6.6.2013, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 17.10.2007
Где: Сергиев Посад

Репутация: -1
Всего: -3



Fortop,  Arantir  спасибо, а Вам awdev отдельное smile видимо мои ранние опыты криво работали из-за версии php - тоже самое делал. ArrayObject лучше тем что это уже не интерфейс, а вполне функциональный класс. Не хотел выкидывать рабочий код, чтобы не отвлекать на детали, как оказалось вышло только хуже(

и вообще есть ли какой-то способ отлавливать вызов методов и изменение атрибутов также как и с ошибочными вариантами? 
если с методами и observer еще все более менее ясно, то вот как с атрибутами быть не ясно
PM MAIL ICQ   Вверх
Fortop
Дата 6.6.2013, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(ShamanVoodoo @  6.6.2013,  17:53 Найти цитируемый пост)
и изменение атрибутов 

не работать с атрибутами

работать с ними только через геттеры/сеттеры. пусть даже и магические __get/__set


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
krundetz
Дата 7.6.2013, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



Цитата(Fortop @  6.6.2013,  23:56 Найти цитируемый пост)
не работать с атрибутами

на прямую из вне класса

сделать все отслеживаемые атрибуты private или protected

Цитата(Fortop @  6.6.2013,  23:56 Найти цитируемый пост)
работать с ними только через геттеры/сеттеры. пусть даже и магические __get/__set 

магические могут быть в некоторых ситуациях даже более удобными, да и количество кода сократиться

изменение атрибутов внутри класса отслеживать придется ручками и событие ручками иниицровать.




--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
awdev
Дата 7.6.2013, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 22.11.2009

Репутация: нет
Всего: 1



А чем мой вариант не подходит для этих задач? вызывается события как для атрибутов так и для методов.
PM MAIL   Вверх
ShamanVoodoo
Дата 9.6.2013, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 17.10.2007
Где: Сергиев Посад

Репутация: -1
Всего: -3



Цитата(awdev @ 7.6.2013,  10:38)
А чем мой вариант не подходит для этих задач? вызывается события как для атрибутов так и для методов.

 для первой части он лучше всего подходит, но там еще есть под вопрос:
Цитата

и вообще есть ли какой-то способ отлавливать вызов методов и изменение атрибутов также как и с ошибочными вариантами? 

все эти танцы с бубном для того, чтобы отлавливать ВСЕ переменные\методы, как верные так и нет.  

т.е.
Код

class A
{
    private $a;
    private $_b;
    
    public function set_a($a)
    {
        ++$this->a;
    }
    
    public function set_b($b)
    {
        ++$this->b;
    }
    
    public function ловушка_для_существующих_свойств($name, $val)
    {
        // срабатывает если задается свойство $а или $_b
    }
    
    public function  __set($name, $val)
    {
        // срабатывает если задается свойство $b
    }
    
    // Основной код класса
    public function action()
    {
        $this->a = 1; 
        // а = 2;
        $this->b = 2;
        // b = 3
        $this->_b = 4;
        // b = 5
    }
}


я никак не могу понять можно ли обойти это как-то непосредственно в коде или решаемо только на уровне своей библиотеки для php
PM MAIL ICQ   Вверх
awdev
Дата 9.6.2013, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 22.11.2009

Репутация: нет
Всего: 1



На SO Предплагают такой вариант http://stackoverflow.com/questions/5891463...getters-setters
некая эмуляция гетерс-сетерс...

Добавлено через 1 минуту и 35 секунд
http://habrahabr.ru/post/39338/
PM MAIL   Вверх
ShamanVoodoo
Дата 9.6.2013, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 17.10.2007
Где: Сергиев Посад

Репутация: -1
Всего: -3



все это дело буксует при попытке работать с переменной как с многомерным массивом, но возможно я слишком многого хочу.

а по поводу использования паттерна наблюдатель, то лучше реализовывать его на базе SPL:
Код

/**
 * В PHP осуществляется встроенная поддержка этого шаблона через входящее в поставку
 * расширение SPL (Standard PHP Library):
 * SplObserver - интерфейс для Observer (наблюдателя),
 * SplSubject - интерфейс Observable (наблюдаемого),
 * SplObjectStorage - вспомогательный класс (обеспечивает улучшенное сохранение и удаление
 * объектов, в частности, реализованы методы attach() и detach()).
 */
class Observable implements SplSubject
{
    private $storage;
    function __construct()
    {
        $this->storage = new SplObjectStorage();
    }
    function attach(SplObserver $observer)
    {
        $this->storage->attach($observer);
    }
    function detach(SplObserver $observer)
    {
        $this->storage->detach($observer);
    }
    function notify()
    {
        foreach($this->storage as $obj)
        {
            $obj->update($this);
        }
    }
    //...
}
abstract class Observer implements SplObserver
{
    private $observable;
    function __construct(Observable $observable)
    {
        $this->observable = $observable;
        $observable->attach($this);
    }
    function update(SplSubject $subject)
    {
        if($subject === $this->observable)
        {
            $this->doUpdate($subject);
        }
    }
    abstract function doUpdate(Observable $observable);
}
class ConcreteObserver extends Observer
{
    function doUpdate(Observable $observable)
    {
        //...
    }
}
$observable = new Observable();
new ConcreteObserver($observable);


сейчас как раз пример модернизуриую под это
PM MAIL ICQ   Вверх
Fortop
Дата 9.6.2013, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(ShamanVoodoo @  9.6.2013,  13:41 Найти цитируемый пост)
все это дело буксует при попытке работать с переменной как с многомерным массивом

Чтобы с ней работать как с многомерным массивом она должна быть им!

Будут ли использоваться стандартные массивы пхп для этого или реализуется некий Value объект разрешающий доступ к себе как к массиву - это неважно

Важно что каждый элемент должен работать как массив

такое вполне реализуемо
Код

$cl = new Obj();

$cl->val1[1] = 100;
$cl->val1[1][10] = 1000;
$cl->val1[1][10][100] = 10000;


Впрочем обычно и бессмысленно в случае с пхп.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ShamanVoodoo
Дата 10.6.2013, 01:06 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 17.10.2007
Где: Сергиев Посад

Репутация: -1
Всего: -3



Fortop> 
в  случае
Код

$cl->val1[1][10][100] = 10000;
$cl->val1[1][10] = 1000;
$cl->val1[1] = 100;

уже работать не будет, ваш вариант я реализовывал, но как только уходишь от одномерных массивов сразу начинаются сложности =\
PM MAIL ICQ   Вверх
Fortop
Дата 10.6.2013, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(ShamanVoodoo @  10.6.2013,  01:06 Найти цитируемый пост)
уже работать не будет

Слушайте, не рассказывайте мне сказок....

Код

$c = new ValueObject();
$c[1][2][3] = 3;
$c[1][2] = 2;
$c[1] = 1;


Вывод с небольшой отладкой
Код

C:\Users\Fortop\Documents\NetBeansProjects\Test>php ar.php
get 1
get 2
set 3 : 3
get 1
set 2 : 2
set 1 : 1



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ShamanVoodoo
Дата 10.6.2013, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 17.10.2007
Где: Сергиев Посад

Репутация: -1
Всего: -3



Fortop> код можно увидеть?
PM MAIL ICQ   Вверх
Fortop
Дата 10.6.2013, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Использовать его в работе нельзя.
Он с ошибками!

Написан всего лишь для демонстрации принципа

Код

<?php

class ValueObject implements ArrayAccess {
    protected $_value = null;
    
    public function __construct($value = null) {
        $this->_default = $value;
    }
    public function offsetExists($offset) {
        echo 'exists ' . print_r($offset, true) . PHP_EOL;
        return isset($this->_value[$offset]);
    }

    public function offsetGet($offset) {
        echo 'get ' . print_r($offset, true) . PHP_EOL;
        if (!isset($this->_value[$offset])) {
            $this->_value[$offset] = new ValueObject();
        }
        return $this->_value[$offset];
    }

    public function offsetSet($offset, $value) {
        echo 'set ' . print_r($offset, true) . ' : ' . print_r($value, true) . PHP_EOL;
        $this->_value[$offset] = new ValueObject($value);
    }

    public function offsetUnset($offset) {
        echo 'unset ' . print_r($offset, true) . PHP_EOL;
        unset($this->_value[$offset]);
    }
}

$c = new ValueObject();
$c[1][2][3] = 3;
$c[1][2] = 2;
$c[1] = 1;




--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ShamanVoodoo
Дата 11.6.2013, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 17.10.2007
Где: Сергиев Посад

Репутация: -1
Всего: -3



Fortop> спасибо, про такой вариант гет'а как-то не додумался, пойду дальше пилить в сторону count и работы с циклами
PM MAIL ICQ   Вверх
awdev
Дата 11.6.2013, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 22.11.2009

Репутация: нет
Всего: 1



Странный ТС, то ему нужны переменные внутри класса как массивы, то теперь чтоб объект класса мог быть тоже массивом smile  smile  
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0912 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.