Можно ли перегружать операторы в PHP?
в частности, я хотел бы создать класс массива и хотел бы перегрузить оператор [].
6 ответов:
Если вы используете 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', вам нужно будет реализовать интерфейс ' Iterator: http://www.php.net/manual/en/class.iterator.php
концепция перегрузки и операторов PHP (см. перегрузка и Операторы Массив) не похоже на концепцию C++. Я не верю, что можно перегружать такие операторы, как+, -, [] и т. д.
Возможные Решения
- реализовать SPL ArrayObject (как указано на cbeer).
- реализовать итератор (Если
ArrayObject
слишком медленно для вы.)- использовать оператор PECL расширение (как упоминалось Бенсон).
для простого и чистого решения в 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"
проще говоря, нет; и я бы предложил, что если вы считаете, что вам нужна перегрузка в стиле C++, вам может потребоваться переосмыслить решение вашей проблемы. Или, может быть, рассмотреть возможность не использовать PHP.
перефразируя Джейми Завински, "у вас есть проблема и подумайте: 'я знаю! Я буду использовать перегрузку оператора!- Теперь у тебя две проблемы."