Вопрос по возврату по ссылке при перегрузке __get

Sat69

Новичок
Вопрос по возврату по ссылке при перегрузке __get

где-то слышал про такую фишку, но не работает:

Код:
<?

class Test
{
	private $Data = array('a', 'b', 'c');
	
	function &__get($var)
	{
		return $this->Data[$var];
	}
	
	function __set($var, $val)
	{
		$this->Data[$var] = $val;
	}
}

$Test = new Test;
$Test->0 = 'aaa';

?>
что я делаю не так?
 

HraKK

Мудак
Команда форума
Радует что человек не знает азбуки, а уже идет сочинять сложные поэмы.
 

Sat69

Новичок
Dl, спасибо конечно, я это всё знаю.

Может быть я конечно идиот, но я где-то слышал, что начиная с версии 5.2 (или около того) подобные конструкции возможны. Даже пример где-то видел, но не проверил сразу. А сейчас стало интересно.

Что происходит в моём понимании: вызывается функция __get которая возвращает ссылку на $Data[$var], дальше $Data[$var] по возвращённой ссылке присваевается значение.

Может быть то, о чём я говорю, вообще не существует и я слышал о муле или не так понял?
 

Sat69

Новичок
Просто хочу поиграться с интересными перегрузками. Хочу писать в массивы по ссылке )) Вот, кстати нашёл примерчик:

http://php.biz.net.id/manual/ru/language.oop5.overloading.php

искать по &__get
 

Sat69

Новичок
Какие однозначные и оперативные выводы. Польщён.

Ну так товаришш демиург, сходи по ссылке, может объяснишь идиоту, что там имеется ввиду?

-~{}~ 13.04.09 01:00:

Кстати гря. Примерчик то рабочий. Ночь просто, устал и туплю.
Конечно-же методы не могут быть цифрами (ну просмотрел), если псевдосвойства называются по правилам - конечно-же пример работает. Потому что при присваивании вызывается просто __set ))

А примерчик был про что-то другое... Я подозреваю, что про использование несуществующих свойств, как массивов, через &__get. Но что-то тоже не очень пока получается воспроизвести. Может линку кинет кто на экзампл?

-~{}~ 13.04.09 01:19:

Всё. Вопрос снят. Это перегрузка гета по ссылке для присваивания значений псевдоэлементам ведущим себя как ассоциалтивный массив. Кому интересно - смотрим следующий код:

Код:
class Test
{
	private $Data = array();
	
	function &__get($var)
	{
		return $this->Data[$var];
	}
	
	function __set($var, $val)
	{
		$this->Data[$var] = $val;
	}
}

$Test = new Test;
$Test->arr['aaa'] = 'a';
echo $Test->arr['aaa'];
Не понимаю почему нельзя было сразу подсказать. Какие-то мелочи, вроде недопустимого имени метода, часто просто по запаре не видны сразу.

За идиота отдельное спасибо.
 

HraKK

Мудак
Команда форума
Ты идиот потому что тебе ответили в 1 посте, потому что во-втором, я уже сарказмом обсмеял твою ошибку, потому что ты даже не выучил банального дебага, потому что тебе даже влом перевести что тебе пишет интерпретатор или забил в поисковик, потому что ты строишь башни не зная как кладут цемент.

Кстати, не стоит на меня обижатся. Это стоит делать только в одном случае - если ты и дальше хочешь оставатся идиотом.
 

Sat69

Новичок
Знаешь, ты сам идиот, если делаешь выводы о людях по какому-то одному случаю.

> потому что тебе ответили в 1 посте, потому что во-втором, я уже
> сарказмом обсмеял твою ошибку
у тебя никогда так не бывало, что ты не замечал самую идиотскую и очевидную ошибку, особенно когда голова тяжёлая от долгого отсутствия сна и сидения за компом?

> потому что ты даже не выучил банального дебага,
я видел, что только переменные могут передаваться по ссылке, но почему-то пытался искать какие-то мистические причины в синтаксисе, вместо того, чтоб понять очевидную ошибку. ещё раз: у тебя так никогда не бывало?

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

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

fixxxer

К.О.
Партнер клуба
Бывает у всех, но тебе в первом же ответе объяснили причину. А неспособность пройти по ссылке и сопоставить одно с другим - это первый нехороший признак. Еще более нехороший признак второй - что начал доказывать на форуме, что ты не идиот и оправдываться. Никого это не интересует, ты не на собеседовании.
 

HraKK

Мудак
Команда форума
А где ремарки на
Ты идиот потому что тебе ответили в 1 посте
потому что тебе даже влом перевести что тебе пишет интерпретатор
или забил в поискови
тыц?

-~{}~ 13.04.09 01:35:

fixxxer
не волнуйся - он свою позицию уже высказал после
Кстати, не стоит на меня обижатся. Это стоит делать только в одном случае - если ты и дальше хочешь оставатся идиотом.
Глупцом быть не страшно, все мы ими были, страшно не признаваться в этом, а искать оправдания как ТС. Как только он поборет в себе это чувству - глядишь что то и вырастет.
 

Sat69

Новичок
я прочитал что мне говорит интерпретатор
я бегло прошёлся по сслыке
я дико ступил, что вовсе не говорит о том, что я не знаю базовых основ языка или не умею отлаживать php код
не думаю, что подобных ситуаций не бывает и у вас изредка
вопрос исчерпан
 

AmdY

Пью пиво
Команда форума
я бегло прошёлся по сслыке
нельзя спешить даже когда бежишь с туалет, можно ботинки замочить. а ты попутал действия, прибежал, растегнул ширинку, достал, но всесто писать начал какать, вот и вышла жопа.
тебе на три буквы, затем ещё на три, а последние три укажут на ответ
php.net/spl
читай всё, там двже больше, чем ответ на твой вопрос, хотя странно что ты не знаешь, это основы пятёрки
 

Sat69

Новичок
AmdY
этого до 5.2 вообще не было :)

бегло - потому что думал, что меня учат юзать ссылки (там про & много), а не именовать свойства (читай переменные)
 

Духовность™

Продвинутый новичок
http://by.php.net/manual/ru/class.arrayaccess.php лучше
реализация данного интерфейса + магические __get и __set и получаем объект, способный работать с объектом как угодно. У меня такой класс умеет вот такие операции делать и является заменителем типа array во многих классах.

PHP:
$this->data = new ArrayAccessImpl();
$this->data['element1'] = 'привет';
$this->data->element2 = 'привет 2'; // тоже самое действие, но "как с объектом"
$this->data['element3'] = array(); // element3 на самом деле не массив, а new ArrayAccessImpl()
$this->data['element3']['element31'] = 'подэлемент';
$this->data->element3->element32 = 'теже яйца';
 

Духовность™

Продвинутый новичок
HraKK
PHP:
    public function offsetSet($index, $value)
    {
        // Это присвоение нового элемента массиву типа $var->groups[]
        if ($index == null)
        {
            $u = &$this->data[];
        }
        else
        {
            $u = &$this->data[$index];
        }

        if (is_array($value))
        {
            $u = new ArrayAccessImpl();

            foreach($value as $idx => $e)
            {
                $u[$idx] = $e;
            }
        }
        else
        {
            $u = $value;
        }
    }
вот такЪ

-~{}~ 13.04.09 20:54:

наверно ниче не понятно...
 
Сверху