Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Класс как ассоциативный массив


Автор: MoLeX 16.6.2011, 10:08
Добрый день. Есть необходимость использовать класс как массив. 
Код

class Test implements ArrayAccess {
    
    private static $obj = array();

    public function __set($name, $value)
    {       
        self::$obj[$name] = $value;
    }
    
    
    public function __get($name)
    {
        return (isset(self::$obj[$name])?self::$obj[$name]:null);
    }
    
    
    public function remove($key)
    {
        unset(self::$obj[$key]);
    }


    public function offsetExists($offset) 
    {
        return isset(self::$obj[$offset]);
    }


    public function offsetGet($offset) 
    {
        return $this->__get($offset);
    }


    public function offsetSet($offset, $value) 
    {
        $this->__set($offset, $value);
    }


    public function offsetUnset($offset) 
    {
        unset(self::$obj[$offset]);
    }
}


$test = new Test();

$test->key = 'value';
echo $test->key.'<br />';   // value
echo $test['key'].'<br />';  // value

$test->key = array('q' => 'qqq', 'w' => 'www');
var_dump($test->key);

echo $test['key']['q'].'<br />'; // qqq


А вот если я захочу сделать так
Код

$test['key']['q'] = 'new q';


то получаю ошибку
Цитата

Notice: Indirect modification of overloaded element of Test has no effect



Можно ли сделать так, чтобы эти способы работали?
Код

$test['array']['key'][0] = 0;
$test['array']['key'][1] = 1;

$test['new'] = array('q' => 1, 'w' => 2);
$test['new']['q'] = 0;

Автор: Shogun 16.6.2011, 11:38
Вроде тут есть что-то по теме. http://habrahabr.ru/blogs/php/103834/

А мне кажется лучше вместо ArrayAccess использовать ArrayObject

Автор: MoLeX 16.6.2011, 12:28
Shogun, спасибо.

Немного изменил класс:
Код

class Test implements ArrayAccess {
    
    private static $obj = array();
    public function __set($name, $value)
    {       
        self::$obj[$name] = $value;
    }
    
    
    public function &__get($name)
    {
        return self::$obj[$name];
    }
   
    public function remove($key)
    {
        unset(self::$obj[$key]);
    }
    public function offsetExists($offset) 
    {
        return isset(self::$obj[$offset]);
    }
    public function offsetGet($offset) 
    {
        return $this->__get($offset);
    }
    public function offsetSet($offset, $value) 
    {
        $this->__set($offset, $value);
    }
    public function offsetUnset($offset) 
    {
        unset(self::$obj[$offset]);
    }
}


и сейчас могу использовать такие способы
Код

$test = new Test();
$test->key = 'value';
echo $test->key.'<br />';   // value
echo $test['key'].'<br />';  // value
$test->key = array('q' => 'qqq', 'w' => 'www');
var_dump($test->key);
echo $test['key']['q'].'<br />'; // qqq


$test->array['key'][0] = 0;
$test->array['key'][1] = 1;
var_dump($test->array);

$test->new = array('q' => 1, 'w' => 2);
var_dump($test->new);

$test->new['q'] = 0;
var_dump($test->new);

Автор: skyboy 17.6.2011, 07:31
Цитата(MoLeX @  16.6.2011,  11:28 Найти цитируемый пост)
и сейчас могу использовать такие способы

так вопрос решен? ;)

Автор: MoLeX 17.6.2011, 08:33
аха)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)