Вопрос о поддержке разыменования объектов на примере.

makkam

Новичок
Как реализовать класс, который будет рабочий для данного кода (см. ниже)?
PHP:
$obj = new MyClass(array('key'=>'value'));
$res = $obj->setObj($value)->getObj();
Делаю так (см. ниже), но не работает. Еще читал статьи про разыменования объектов. Но там нет примера самого класса. Если кто-то сталкивался с таким =) подскажите пожалуйста.

А моя (нерабочая) реализация такая:
PHP:
class MyClass {
        
        function MyClass($arr) {
            $res = array();
            foreach($arr as $k=>$v) {
                $this->$k=$v;
            }
        }
        
        function setObj($v){
            $this->key=$v;
        }    
        
        function getObj(){
            $this->key;
        }
}
Сейчас она выдает ошибку: Fatal error: Call to a member function getObj() on a non-object. У меня php 5.2, не 4. Но думаю, в моем случае дело не в этом, наверное.

Помогите!
 

Ragazzo

TDD interested
makkam
тебе бы английский подучить и читать что php тебе в ошибках пишет...и тогда никакого шаманства и гаданий...
 

makkam

Новичок
Я понял в чем ошибка (точнее, понял из перевода)... английский немного знаю... "вылетело" как-то из головы, что можно же this вернуть. Expiriens-а мало =)
Crys - Спасибо БОЛЬШОЕ! Код работает.

А теперь другой вопросик есть. Как правильно реализовать класс, все тот же класс (см. выше), чтобы в массиве $result были единицы $result('0'=>'1', '1'='1'). Тоесть чтобы класс правильно работал для кода написанного ниже:
PHP:
$obj = new MyClass(array('key1'=>'value1', 'key2'=>'value2'));
$res = $obj->setObj($value)->getObj();

$result = array();
$result[]='value1'===$obj['key1'];
$result[]=2===count($obj);
 

makkam

Новичок
Я реализовал так:
PHP:
class MyClass {
        
        function MyClass($arr) {
            $res = array();
            foreach($arr as $k=>$v) {
                $this->$k=$v;
            }
        }
}
Но выдает ошибку Fatal error: Cannot use object of type MyClass as array - как бы понятно (нельзя использовать объект MyClass как массив). Напрашивается вывод, что я неправильно реализовал класс =)
Из ошибки следкет, что нужно вместо $obj['key1'] писать $obj->key1. Но по условию эту строку менять нельзя. Из чего и получается что неправильно реализован класс. А как правильно? Это вообще возможно. Помогите пожалуйста разобраться.
 

makkam

Новичок
AmdY спасибо. Теперь в $result значения 1 (единички). Реализовал (переписал) класс так:
PHP:
class MyClass extends ArrayObject {
        
        public function __construct($arr) {
            foreach($arr as $k=>$v) {
                $this[$k]=$v;
            }
        }

        function setObj($v){
            $this['key1']=$v;
            return $this;
        }    
        
        function getObj(){
            return $this['key1'];
        }
}
Так правильно по spl для php 5.2?
 
Сверху