В частности, я хотел бы создать класс Array и хотел бы перегрузить оператор [].
Если вы используете PHP5 (и вы должны быть), взгляните на классы SPL ArrayObject . Документация не слишком хорошая, но я думаю, что если вы расширите ArrayObject, у вас будет свой «поддельный» массив.
EDIT: Вот мой быстрый пример; Боюсь, у меня нет полезного варианта:
class a extends ArrayObject { public function offsetSet($i, $v) { echo 'appending ' . $v; parent::offsetSet($i, $v); } } $a = new a; $a[] = 1;
На самом деле оптимальным решением является реализация четырех методов интерфейса ArrayAccess: http://php.net/manual/en/class.arrayaccess.php
Если вы также хотели бы использовать свой объект в контексте «foreach», вам необходимо реализовать интерфейс «Итератор»: http://www.php.net/manual/en/class.iterator.php
Концепция перегрузки PHP и операторов (см. « Перегрузка» и « Операторы массива» ) не похожа на концепцию C ++. Я не считаю, что можно перегрузить операторы, такие как +, -, [] и т. Д.
Возможные решения
ArrayObject
слишком медленный для вас). Для простого и чистого решения в PHP 5.0+ вам необходимо реализовать интерфейс ArrayAccess
и переопределить функции offsetGet, offsetSet, offsetExists и offsetUnset. Теперь вы можете использовать объект как массив.
Пример:
<?php class A implements ArrayAccess { private $data = array(); public function offsetGet($offset) { return isset($this->data[$offset]) ? $this->data[$offset] : null; } public function offsetSet($offset, $value) { if ($offset === null) { $this->data[] = $value; } else { $this->data[$offset] = $value; } } public function offsetExists($offset) { return isset($this->data[$offset]); } public function offsetUnset($offset) { unset($this->data[$offset]); } } $obj = new A; $obj[] = 'a'; $obj['k'] = 'b'; echo $obj[0], $obj['k']; // print "ab"
не<?php class A implements ArrayAccess { private $data = array(); public function offsetGet($offset) { return isset($this->data[$offset]) ? $this->data[$offset] : null; } public function offsetSet($offset, $value) { if ($offset === null) { $this->data[] = $value; } else { $this->data[$offset] = $value; } } public function offsetExists($offset) { return isset($this->data[$offset]); } public function offsetUnset($offset) { unset($this->data[$offset]); } } $obj = new A; $obj[] = 'a'; $obj['k'] = 'b'; echo $obj[0], $obj['k']; // print "ab"
Кажется, это не особенность языка, см. Эту ошибку . Однако похоже, что есть пакет, который позволяет вам выполнять какую-то перегрузку.
Проще говоря, нет; и я бы предположил, что если вы считаете, что вам нужна перегрузка в стиле C ++, вам может потребоваться переосмыслить решение вашей проблемы. Или, может быть, не стоит использовать PHP.
Перефразируя Джейми Завински: «У вас есть проблема и подумайте», я знаю, я буду использовать перегрузку оператора! » Теперь у вас две проблемы.