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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Событие при изменении атрибута объекта 
:(
    Опции темы
ShamanVoodoo
Дата 1.6.2013, 18:43 (ссылка)   | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



упрощенный пример:
Код

class Controller
{
    protected $_var = array();
    
    // содержит код сохранения переменной $_var
    // например в БД
    public function save(){}
    
    public function action()
    {
        $var['test'] = 'blabla';
    }
    
    public function __set($key, $val)
    {
        if ($key == 'var')
        {
            $_var = $val;
            $this->save();
        }
    }
}

т.е.  задаем(и сохраняем) атрибут через __set 
проблема в том, что $_var ($var) должна работать как массив, а при таком варианте возникает ошибка
как реализовать подобный вариант(когда-то пробовал через ArrayObject, но не получилось)
и вообще есть ли какой-то способ отлавливать вызов методов и изменение атрибутов также как и с ошибочными вариантами?
PM MAIL ICQ   Вверх
Arantir
Дата 1.6.2013, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

Репутация: 2
Всего: 55



На вид какая-то странная смесь модели и контроллера. Может в этом проблема (в неправильном подходе/архитектуре)?

Почему не сделать вот так
Код

$_var[] = $val;
?


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
ShamanVoodoo
Дата 1.6.2013, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Arantir @  1.6.2013,  18:50 Найти цитируемый пост)
На вид какая-то странная смесь модели и контроллера. Может в этом проблема (в неправильном подходе/архитектуре)?

по поводу кода это просто пример и mvc тут ни при чем. не несите чушь

Цитата(Arantir @  1.6.2013,  18:50 Найти цитируемый пост)
Почему не сделать вот так

где именно?
PM MAIL ICQ   Вверх
awdev
Дата 2.6.2013, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код


class Controller
{
    protected $_vars = array();
    protected function save(){
        echo "Saving...".print_r($this->_vars,true).PHP_EOL;
    }
    public function __call($name, $args){
        echo "CALL: $name".PHP_EOL;
        $this->$name($args);
    }
    public function __get($key){    
        echo "Get $key".PHP_EOL;
        if(isset($this->_vars[$key]))
            return $this->_vars[$key];
        else
            return NULL;
    }
    public function __set($key, $value){
        echo "Set $key=$value".PHP_EOL;
        $this->_vars[$key] = $value;
        $this->save();
    }
}

class Child extends Controller{    
    protected function foo($args){    
        var_dump($args);
    }
}
$c = new Child;
$c->a=2;
echo "A is: ".$c->a.PHP_EOL;
$c->foo("test");


Результат:
Цитата


Set a=2
Saving...Array
(
    [a] => 2
)

Get a
A is: 2
CALL: foo
array(1) {
  [0]=>
  string(4) "test"
}


PM MAIL   Вверх
ShamanVoodoo
Дата 2.6.2013, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



awdev пасиб за старания, но это не то:  представь, что кроме $_vars еще 10 таких атрибутов, кроме этого атрибут должен работать как массив т.е. $c->a[4]=2;
PM MAIL ICQ   Вверх
krundetz
Дата 3.6.2013, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

class Controller
{
    protected $_var = array();
    
    // содержит код сохранения переменной $_var
    // например в БД
    public function save(){}
    

    public function action()
    {
        $var['test'] = 'blabla';
    }
    
    public function __set($key, $val)
    {
        //не понял что эта проверка должна делать?
        //if ($key == 'var')
        //вместо вашей напрашивается такая но и она здесь не нужна
        //так как тогда нужно задать все возможные ключи
        //либо работать с приватными атрибутами
        //у вас нет ни того не другого
        //поэтому проверку тоже заключаем в коментарий
        //if(isset($_var[$key]))
        //{
            $_var[$key] = $val;
            //он здесь не нужен если у вам нужно событие на изменение атрибута объекта
            //$this->save();
            //обработчик события, выступает инициатором события
            $this->event($key, $val);
        //}
    }

    private function event($key, $val) {
        echo 'Произошло изменение атрибута ' . $key . ' новое значение ' . $val;
    }
}


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

Это сообщение отредактировал(а) krundetz - 3.6.2013, 09:35


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


НЭТ БИЛЭТ
**


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

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



Код

class MyClass
  {
   protected
     $_vars = array();
   public
     function __set($key, $val)
       {
       $this->_vars[$key] = $val;
       }
     function &__get($key)
       {
      // if (!isset($this->_vars[$key]))$this->_vars[$key]=null;
       return $this->_vars[$key];
       }
   }

$obj = new MyClass;
$obj->a[]=666;
$obj->a[]=555;

print_r($obj->a);






--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
ShamanVoodoo
Дата 3.6.2013, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



krundetz> я писал уже может быть не только $_var, но и $_var2 и т.д.
Чучмек> тоже не то т.к. определенный индекс массива нельзя задать
PM MAIL ICQ   Вверх
Чучмек
Дата 3.6.2013, 17:59 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



То, не то. Гадание на кофейной гуще. 
Насколько понятен вопрос - настолько точен ответ.
Что ты хочешь контролировать?
Добавление свойств в объект?
Контролировать конкретное свойство(а)?
Контролировать вставляемые ключ=>значение в свойство-массив?



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Arantir
Дата 3.6.2013, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

Репутация: 2
Всего: 55



Кажись наконец-то доперло...
ТС хочет отлавливать вот такое:
Код

$c = new Controller;
$c->var1 = array(); // вызывается Controller::__set
$c->var1['a'] = 0;  // ни одним из приведенных примеров не отлавливается


Это сообщение отредактировал(а) Arantir - 3.6.2013, 18:55


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Arantir
Дата 3.6.2013, 19:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

Репутация: 2
Всего: 55



Проблема в том, что изменения массива надо отслеживать в классе объекта массива, а не в классе, где этот объект является простым полем.
придется свой массив создавать:
Код

class InnerArray implements \ArrayAccess 
{
    private $container;

    public function __construct() {
        $this->container = array();
    }

    public function onChange($args = null)
    {
        echo 'changed!';
        // ...
    }

    public function offsetSet($offset, $value) {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
        $this->onChange(array('key'=>$offset, 'value'=>$value));
    }

    public function offsetExists($offset) {
        return isset($this->container[$offset]);
    }

    public function offsetUnset($offset) {
        unset($this->container[$offset]);
    }

    public function offsetGet($offset) {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }
}
Код


class Controller
{
    public $var1 = new InnerArray();



Это сообщение отредактировал(а) Arantir - 3.6.2013, 19:28


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
ShamanVoodoo
Дата 3.6.2013, 22:28 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вопрос задан нормально, ArrayObject  вам не известен судя по постам хоть я его и упоминал. вопрос адресован прежде всего профессионалам, был бы он настолько прост я бы его вообще не задал.

Это сообщение отредактировал(а) ShamanVoodoo - 3.6.2013, 22:30
PM MAIL ICQ   Вверх
Fortop
Дата 4.6.2013, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ShamanVoodoo @  3.6.2013,  22:28 Найти цитируемый пост)
вопрос адресован прежде всего профессионалам

Нас звали?
Мы пришли.

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

Hint: чтобы свойство реагировало как массив оно должно реализовывать интерфейс массива, что вам и показали в предыдущем примере.
А уж как вы будете реализовывать - это ваши половые трудности.


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


Шустрый
*


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

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



Вот такой ###код получился.. разгребай  smile 
Код

<?
class myArray implements ArrayAccess{
    protected $container;
    protected $ob;
    public function __construct($observe) {
        $this->container=array();
        $this->ob = &$observe;
    }
    public function offsetSet($offset, $value) {
        $this->ob->save($offset, $value);
         if (is_null($offset)) {
                $this->container[] = &$value;
         } else {
                $this->container[$offset] = &$value;
         }

        }
        public function offsetExists($offset) {
            return isset($this->container[$offset]);
        }
        public function offsetUnset($offset) {
            unset($this->container[$offset]);
        }
        public function offsetGet($offset) {

            return isset($this->container[$offset]) ? $this->container[$offset] : null;
        }
    
        
}
class Controller
{
    protected $_vars = NULL;
    public function __construct(){ $this->_vars=new myArray( $this );}

    protected function save($args){
        echo "Saving...{$args[0]}={$args[1]}".PHP_EOL;
    }
    public function __call($name, $args){
        echo "CALL: $name".PHP_EOL;
        $this->$name($args);
    }
    public function __get($key){    
        echo "Get $key".PHP_EOL;
    return $this->_vars;
        
    }
    public function __set($key, $value){
        echo "Set $key=$value".PHP_EOL;
        $this->_vars[$key] = $value;
        $this->save();
    }
}
class Child extends Controller{    
    protected function foo($args){    
        var_dump($args);
    }
}
$c = new Child;
$c->var1['var1']='value11';
$c->var2['var2']='value22';
echo PHP_EOL;
echo "var1 is: ".$c->var1['var1'].PHP_EOL;
echo "var2 is: ".$c->var2['var2'].PHP_EOL;

$c->foo("test");

Вывод:
Цитата


Get var1
CALL: save
Saving...var1=value11
Get var2
CALL: save
Saving...var2=value22

Get var1
var1 is: value11
Get var2
var2 is: value22
CALL: foo
array(1) {
  [0]=>
  string(4) "test"
}


То есть можно использовать много псевдо переменных: $c->foo[1]=1; $c->bar[2]=2;  при этом вызывается метод SAVE при новом значении, ну и функции так же через жопу но можно проследить. вызывается __call
PM MAIL   Вверх
Arantir
Дата 4.6.2013, 02:16 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

Репутация: 2
Всего: 55



Цитата(ShamanVoodoo @  3.6.2013,  21:28 Найти цитируемый пост)
вопрос адресован прежде всего профессионалам
Черт, даже зарабатывать этим на жизнь уже недостаточно, чтобы это можно было назвать своей профессией  smile 

Цитата(ShamanVoodoo @  3.6.2013,  21:28 Найти цитируемый пост)
ArrayObject  вам не известен судя по постам хоть я его и упоминал
Если Вы знаете решение, то в чем проблема?

ArrayObject как раз таки ArrayAccess и реализует, на который в первую очередь PHP и опирается при определении корректности использования квадратных скобочек на объект. Остальное в нем — это свистели и переделки массива как такового, вроде сортировки. Если они Вам нужны — пожалуйста, реализовывайте, никто же не запрещает.
Вы дали понять только то, что хотите отловить момент изменения элемента массива. Для этого достаточно ArrayAccess.


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

Код

class Controller implements Listener
{
    public $var;
    
    public function __construct()
    {
        $this->var = new InnerArray($this);
    }

    public function event($args)
    {
        echo "{$args['key']} saved as {$args['value']}";
    }
}
Код

interface Listener
{
    public function event($args);
}

class InnerArray implements \ArrayAccess 
{
    private $container = array();
    private $listener;

    public function __construct(Listener $listener) {
        $this->listener = $listener;
    }

    public function offsetSet($offset, $value) {
        if (is_null($offset)) $this->container[] = $value;
        else $this->container[$offset] = $value;
        $this->listener->event(array('key'=>$offset, 'value'=>$value));
    }

    public function offsetExists($offset) {
        return isset($this->container[$offset]);
    }

    public function offsetUnset($offset) {
        unset($this->container[$offset]);
    }

    public function offsetGet($offset) {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }
}


Код

$c = new Controller;
$c->var['foo'] = 'bar';
Код

foo saved as bar 



--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
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   Вверх
ShamanVoodoo
Дата 12.6.2013, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Код

class Controller
{
    /**
     * этапы работы контроллера:
     * 1. before()
     * 2. action()
     * 3. after()
    */
    protected $session;
    
    protected before()
    {
        $this->session = Session::instance();
    }
    
    protected action()
    {
        // при этом данные автоматом кодируются и заносятся в сессию
        $this->session['test'][1] = '123';
    }
    
    protected after()
    {
        // можно было бы результат тут сохранять,
        // но если в action редирект или ошибка,
        // то до этого места мы не дойдем
    }
}

PM MAIL ICQ   Вверх
ShamanVoodoo
Дата 23.6.2013, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ   Вверх
Fortop
Дата 24.6.2013, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ужас. Вопрос не вопрос и понять его....


Цитата(ShamanVoodoo @  23.6.2013,  16:28 Найти цитируемый пост)
осталась одна проблема: когда задаем $c[1][2][3] = 3; в set offset = 3, соответсвенно невозможно понять какое именно значение было перезаписано

Какое значение?
Кем было перезаписано?

Цитата(ShamanVoodoo @  23.6.2013,  16:28 Найти цитируемый пост)
 как получить текущее положение [1][2][3]

Храните в объекте ссылку/адрес родителя. Она же будет вашим текущим положением.



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


Шустрый
*


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

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



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

PM MAIL ICQ   Вверх
krundetz
Дата 27.6.2013, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(ShamanVoodoo @  24.6.2013,  23:44 Найти цитируемый пост)
Fortop, по русски это хрен объяснишь... 

 smile ну объясняйте по английски(или на языке которым вы лучше всего владеете) если вам так проще


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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