Array Access Overloading(+)

Sherman

Mephi
Array Access Overloading(+)

Как мне сделать такую штуку.

Есть класс:

Collection implements Iterator

С foreach все работает замечательно, но мне нужно сделать возможным и такой синтаксис:

PHP:
$obj = new Collection();
$numObj = count($obj);
for($i=0;$i<$numObj;$i++)
{
  echo $obj[$i]['key'];
}
Возможно ли такое сделать, и если да то как?

т.е. иными словами перегрузить оператор [].
 

Sherman

Mephi
Как это реализовать?

Я пока сделал вот так(метод класса Collection):

PHP:
public function getItemByIndex($index, $key)
{
   	$val = $this->items[$index]->$key;
   	if (!empty($val))
   	{   				
   		return $this->items[$index]->$key;
   	}
   	return null; 
}
но выглядит это не солидно.

$enumerableObj->colObj->getItemByIndex($index, "key");

хочу чтобы выглядело так:

$enumerableObj->colObj[$index]["key"];

класс Collection у меня используется в других классах, чтобы хранить коллекции объектов.

p.s. вобщем до php5 еще очень далеко даже до C# 1.0, что уж говорить про C# 2.0, в плане удобства синтаксиса и возможных языковых конструкций:(
 

Sherman

Mephi
Библиотека твоя почти вся not documented. Неужели сложно чиркнуть две строчки, если знаешь...
 

Frol

Новичок
ок.
для особо одаренных.
открой в мане главу SPL.
найди "подсказку", прочитай.
она в синей рамочке, да.
 

Sherman

Mephi
Реализовал интерфейс ArrayAccess. Обнаружился баг(?):

если передавать в качестве аргумента(индекс) скалярное выражение, например: $i+1, а не просто переменную или значение, то apache крашится...
 

Sherman

Mephi
5.0.4.

-~{}~ 25.08.05 23:47:

вот запостил:

http://bugs.php.net/bug.php?id=34259&thanks=4

но английским владею плохо:(
 

itprog

Cruftsman
Sherman
Только что проверил на последнем PHP 5.1:
Результат: no crash,
Array
(
[0] => Array
(
[key1] => 1
[key2] => test
)

)

Кстати, print_r($col[$i+0]); //crush
а зачем сюда к $i прибавлять нолик?
 

Sherman

Mephi
А это просто, чтобы показать, что значение индекса значения не имеет, т.е. неважно есть ли элемент по данному индексу или нет его, любая скалярная операция вызывает у меня crush apache.

Вообще много пользовал новые фитчи 5.0.x, связанные с ООП последнее время и уже жалею, что вообще взялся за реализацию проекта на этом(уж лучше бы по странике в php4 слабал бы все это):(

Баги, ограничения, путаница с документацией и версиями. Может я конечно слишком привередливый, но на том же .NET все эти вещи и многие другие делалилсь прекарсно в 1999 году еще(C#, .net 1.0 beta 2).
 
Сверху