Можно ли перегрузить операторы в PHP?

В частности, я хотел бы создать класс 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 ++. Я не считаю, что можно перегрузить операторы, такие как +, -, [] и т. Д.

Возможные решения

  • Внедрите SPL ArrayObject (как упоминается cbeer ).
  • Внедрить Iterator (если ArrayObject слишком медленный для вас).
  • Используйте расширение оператора PECL (как упоминалось в Benson ).

Для простого и чистого решения в 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.

Перефразируя Джейми Завински: «У вас есть проблема и подумайте», я знаю, я буду использовать перегрузку оператора! » Теперь у вас две проблемы.