Возможно ли перегрузить операторы в PHP? - PullRequest
61 голосов
/ 25 апреля 2009

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

Ответы [ 6 ]

52 голосов
/ 25 апреля 2009

Если вы используете PHP5 (и вам следует), взгляните на классы SPL ArrayObject . Документация не слишком хорошая, но я думаю, что если вы расширите ArrayObject, у вас будет ваш «поддельный» массив.

РЕДАКТИРОВАТЬ: Вот мой быстрый пример; Боюсь, у меня нет ценного варианта использования:

class a extends ArrayObject {
    public function offsetSet($i, $v) {
        echo 'appending ' . $v;
        parent::offsetSet($i, $v);
    }
}

$a = new a;
$a[] = 1;
25 голосов
/ 15 декабря 2011

На самом деле, оптимальным решением является реализация четырех методов интерфейса ArrayAccess: http://php.net/manual/en/class.arrayaccess.php

Если вы также хотите использовать свой объект в контексте 'foreach', вам необходимо реализовать интерфейс 'Iterator': http://www.php.net/manual/en/class.iterator.php

21 голосов
/ 25 апреля 2009

Концепция перегрузки и операторов в PHP (см. Перегрузка и Операторы массива ) не похожа на концепцию C ++. Я не верю, что возможно перегрузить операторы, такие как +, -, [] и т. Д.

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

8 голосов
/ 03 июня 2014

Для простого и понятного решения в 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"
2 голосов
/ 25 апреля 2009

Похоже, что это не особенность языка, см. ошибка . Тем не менее, похоже, что существует пакет , который позволяет выполнять какую-то перегрузку.

0 голосов
/ 25 апреля 2009

Проще говоря, нет; и я полагаю, что если вы считаете, что вам нужна перегрузка в стиле C ++, вам, возможно, придется переосмыслить решение вашей проблемы. Или, возможно, рассмотрите возможность не использовать PHP.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...