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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение индекса массива через __get 
:(
    Опции темы
Mal Hack
Дата 9.8.2006, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

Репутация: 8
Всего: 261



imm, я вроде понятно же написал, что мне не МЕТОД нужен, а ЭЛЕМЕНТ МАССИВА, который является СВОЙСТВОМ.
PM ICQ   Вверх
imm
Дата 9.8.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ано там так и есть, просто я попутал терминологию, ты запусти, оно работает.

В CMyClass (наследник от CLoader) по необходимости нужно переопределить следующие методы:
 - В качестве параметров функции передается имя твоего свойства и указанный индекс
 - Метод возвращает значение, которое необходимо извлеч по паре свойство[индекс]
public function getMemberValue($member_name, $index)
 - Пытается записать в пару свойство[индекс] переданное значение value
public function setMemberValue($member_name, $index, $value)
 - Пытается очистить значение, сохраненное в паре свойство[индекс]
public function freeMemberValue($member_name, $index)

Простейший пример:
Код

$b = new CMyClass;
$a = $b->myProperty['myIndex'];


В процессе выполнения последней строки, в объекте $b будет вызвана функция getMemberValue, значения переданных параметров будут:
$member_name <- 'myProperty'
$index <- 'myIndex'
И то, что эта функция возвратит будет записано в $a.

PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 9.8.2006, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

Репутация: 8
Всего: 261



Слишком "тяжелый вариант"... Да, жаль нет перегрузки []...
PM ICQ   Вверх
WIPS
Дата 30.4.2008, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Есть какие нибудь идеи, чтобы при вот таком обращении:
Код

$a = $instance->LNG;

в $a возвращался массив
Код

array('index_1' = 'value');

а не объект класса CIndexReader? Долго кручу, пока не могу найти решения.
В худшем случае хотелось бы удостовериться, что это невозможно smile, т.к. терзают смутные сомнения, что это у меня просто не получается.
--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 30.4.2008, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



WIPS, для этого надо хранить там массив.

$instance->LNG = array('index_1' => 'value');


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


Бывалый
*


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

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



Fortop, обращения к полю могут идти в любом виде:
Код

$instance->LNG = array('index_1' => 'value');
$instance->LNG['index_1'] = 'value';
$a = $instance->LNG;
$a = $instance->LNG['index_1'];

хочу, чтоб работало во всех вариантах.

CyClon, надо было создать новую тему?
--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 1.5.2008, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



WIPS,
Ну и что тут сложного?

Тебе надо будет работать с  __get(), __set(), ArrayAccess.
Выше по топику это описано. Или ты не знаешь как инкапсулировать один класс внутри другого?

Вот.
Код

class Store
{
    private $data;

    function __construct()
    {
         $this->data = new MultiAccess();
    }
}



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


Бывалый
*


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

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



Fortop, очень абстрактное, для меня лично, объяснение. Если не сложно ткните носом (а еще лучше куском кода).
Просто сейчас проблема заключается в следующем, есть код:
Код

$a = $instance->LNG;
$a = $instance->LNG['index_1'];

в принципе, если я верно рассуждаю, он эквивалентен такому псевдокоду:
Код

$a = $instance->LNG;
$a = $instance->LNG::getOffset('index_1');

что в свою очередь эквивалентно:
Код

$a = $instance->LNG;
$b = $instance->LNG;
$a = $b::getOffset('index_1');

т.е., и в случае обращения как к элементу массива, так и в случае обращения как к полю объекта, сначала вызывается __get(), но уже в нем мне надо знать возвращать ли объект, реализующий ArrayAccess, или просто значение запрашиваемого поля.

Цитата(Fortop @  30.4.2008,  23:15 Найти цитируемый пост)
Или ты не знаешь как инкапсулировать один класс внутри другого?

Как инкапсулировать знаю, но пока не вижу что внутри чего нужно "спрятать".

Это сообщение отредактировал(а) WIPS - 1.5.2008, 15:39
--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 1.5.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



WIPS, обрати внимание, ты хочешь чтобы к любым данным класса можно было обращаться и как к свойству и как к индексу массива.
Для свойства - нужно чтобы класс реализовывал методы __get(), __set()
Для доступа через индекс -  класс должен реализовывать интерфейс ArrayAccess.

Далее, ты хочешь чтобы любой извлекаемый элемент из этого класса тоже обладал такими же особенностями. Это значит что каждый элемент в свою очередь тоже должен реализовывать методы __get(), __set() и интерфейс ArrayAccess.

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

Вот примерно так
Код

$a = new MultiAccess;

$a['11'] = '0101';
// это будет чудо свойство
$a->child = new MultiAccess;
$a['child']['root'] = 202;
var_dump($a->child->root);


Можно модифицировать методы __get() и OffsetGet()
следующим образом

Код

    if(!array_key_exists($key, $this->_data)) {
        $this->_data[$key] = new self;
    }
    return $this->_data[$key];


Тогда станет возможным даже такое присвоение.
Код

// нам плевать, есть ли свойство, партия сказала НАДО
$a->second['rt'] = 303;
var_dump($a->second['rt']);

$a['third']->middle['read'] = 404;
var_dump($a['third']['middle']->read);


НО! В этом случае ты не сможешь определять, существует ли соответствующее свойство и индекс. И тебе прийдется писать отдельные методы для этого. В общем извращаться можно как угодно.
Совет следующий - определись, как ты будешь получать доступ, как к элементу массива, или как к свойству - так и работай. Иначе сам запутаешься smile

Вот собственно класс. Соответствующие проверки и Exception - допишешь самостоятельно.

Код

class MultiAccess implements ArrayAccess
{
    private $_data;


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

    public function __get($key) {
        if(!array_key_exists($key, $this->_data)) {
            $this->_data[$key] = new self;
        }
        return $this->_data[$key];
    }

    public function __set($key, $value) {
        $this->_data[$key] = $value;
    }

    public function OffsetExists($key) {
        return array_key_exists($key, $this->_data);
    }

    public function OffsetUnset($key) {
     unset($this->_data[$key]);
    }

    public function OffsetGet($key) {
        if(!array_key_exists($key, $this->_data)) {
            $this->_data[$key] = new self;
        }
        return $this->_data[$key];
    }

    public function OffsetSet($key, $val) {
     $this->_data[$key] = $val;
    }
}



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
IZ@TOP
Дата 20.5.2008, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


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

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



Блин, ребята, учите библиотеку SPL!


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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