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


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

6 59

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++. Я не верю, что можно перегружать такие операторы, как+, -, [] и т. д.

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

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

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