метод __get и проблема

green-84

Новичок
метод __get и проблема

Создан некоторый класс SomeClass, свойства которого устанавливаются после инициализации объекта и задаются с помощью метода "__set", а получаются - с помощью "__get".

PHP:
<?php

class SomeClass {
	private $Properties = array();

	function __get($propertyName) {
		if(array_key_exists($propertyName, $this->Properties)) {
			return $this->Properties[$propertyName];
		}
		else {
			echo("property ".$propertyName." not found <br />");
		}
	}# __get #
	
	function __set($propertyName, $propertyValue) {
		$this->Properties[$propertyName] = $propertyValue;
		echo ("set $propertyName = ".var_export($propertyValue, true)." <br />");
	}# __set #

}// SomeClass

$obj = new SomeClass();

$obj->Name = "TestObject";
$obj->SomeCollection = array('first'=>"FirstElement", 'second'=>"SecondElement");
$obj->SomeCollection['third'] = "ThirdElement";

echo $obj->Name; echo "<br />";
print_r($obj->SomeCollection); echo "<br />";
	
?>

Вывод:

PHP:
set Name = 'TestObject'
set SomeCollection = array ( 'first' => 'FirstElement', 'second' => 'SecondElement', )
TestObject
Array ( [first] => FirstElement [second] => SecondElement )


Возникла проблема при присвоении значения свойству "SomeCollection" объекта "obj".
При инициализации данного свойства

PHP:
$obj->SomeCollection = array('first'=>"FirstElement", 'second'=>"SecondElement");
в массив "Properties" класса "SomeClass" добавляется новый элемент "SomeCollection"=>array('first'=>"FirstElement", 'second'=>"SecondElement")

но если я захочу установить новый элемент массива "SomeCollection" через

PHP:
$obj->SomeCollection['third'] = "ThirdElement";
метод __get не вызывается.


Кто может подсказать как можно заставить срабатывать __get при
PHP:
$obj->SomeCollection['third'] = "ThirdElement";
или предложить другой простой способ добавления элементов в массив "SomeCollection" кроме как
PHP:
$SomeCollection = $obj->SomeCollection;
$SomeCollection['third'] = "ThirdElement";
$obj->SomeCollection = $SomeCollection;
 

green-84

Новичок
Автор оригинала: mishco
а зачем это нужно?
Это нужно для простого добавления элементов в массив, который является "динимическим" свойством некоторого объекта.
 
А как тебе такое:
PHP:
function blah()
{
    return array('foo' => 'bar');
}

echo blah()['foo'];
? работает ? ты не удивлен ? аналогия очевидна ?

-~{}~ 26.07.07 19:36:

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

$object->someCollection->third = ....
 

green-84

Новичок
Автор оригинала: mishco
А как тебе такое:
PHP:
function blah()
{
    return array('foo' => 'bar');
}

echo blah()['foo'];
? работает ? ты не удивлен ? аналогия очевидна ?

-~{}~ 26.07.07 19:36:

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

$object->someCollection->third = ....
Не совсем понял, зачем ты привел такой код для аналогии. Если можешь, проведи аналогию на моем примере, а не на 1.получение значения функции -> 2.обращение к элементу массива значения функции.
Кто-нибудь знает, почему все-таки в

PHP:
$obj->SomeCollection['third'] = "ThirdElement";
не вызывается метод __get.


P.S.
Хотелось бы получить более полезный совет, чем "прекращать страдать херней" :)
 
А ты включи error_reporting(E_ALL | E_STRICT); ini_set('display_errors', true); и все сам поймешь.

-~{}~ 26.07.07 19:54:

Совет один, если очередное мегакульное и по-твоему замечательное решение попросту не работает, это не повод бежать на форум и разводить нюни. надо действительно думать головой прежде чем городить херню.

-~{}~ 26.07.07 19:57:

а еще ты очень удивишся, но перегрузка существует не для "создания динамических свойств", они и так могут создаваться динамически, например, такой код:
PHP:
$object = new stdClass();
$object->collection = array('one' => '1', 'two' => '2');
$object->collection['three'] = '3';
var_dump($object->collection);
КАК НИ СТРАННО, РАБОТАЕТ!
потому продолжай дерзать, побольше читай, и главное -- думай.
 

green-84

Новичок
Автор оригинала: mishco
А ты включи error_reporting(E_ALL | E_STRICT); ini_set('display_errors', true); и все сам поймешь.

-~{}~ 26.07.07 19:54:

Совет один, если очередное мегакульное и по-твоему замечательное решение попросту не работает, это не повод бежать на форум и разводить нюни. надо действительно думать головой прежде чем городить херню.

-~{}~ 26.07.07 19:57:

а еще ты очень удивишся, но перегрузка существует не для "создания динамических свойств", они и так могут создаваться динамически, например, такой код:
PHP:
$object = new stdClass();
$object->collection = array('one' => '1', 'two' => '2');
$object->collection['three'] = '3';
var_dump($object->collection);
КАК НИ СТРАННО, РАБОТАЕТ!
потому продолжай дерзать, побольше читай, и главное -- думай.
Спасибо, мэн.
 
Сверху