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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс как ассоциативный массив 
V
    Опции темы
MoLeX
  Дата 16.6.2011, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Добрый день. Есть необходимость использовать класс как массив. 
Код

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;


Это сообщение отредактировал(а) MoLeX - 16.6.2011, 10:09


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Shogun
Дата 16.6.2011, 11:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


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

Репутация: 9
Всего: 11



Вроде тут есть что-то по теме. http://habrahabr.ru/blogs/php/103834/

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


--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
MoLeX
Дата 16.6.2011, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



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);



--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
skyboy
Дата 17.6.2011, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

Репутация: 75
Всего: 260



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

так вопрос решен? ;)
PM MAIL   Вверх
MoLeX
Дата 17.6.2011, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



аха)


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

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


 




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


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

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