67

具体来说,我想创建一个 Array 类并想重载 [] 运算符。

4

6 回答 6

54

如果您使用的是 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;
于 2009-04-24T22:06:01.497 回答
28

其实最优方案是实现ArrayAccess接口的四个方法:http: //php.net/manual/en/class.arrayaccess.php

如果您还想在“foreach”的上下文中使用您的对象,则必须实现“迭代器”接口: http ://www.php.net/manual/en/class.iterator.php

于 2011-12-15T09:06:42.430 回答
23

PHP 的重载和运算符概念(请参阅重载数组运算符)与 C++ 的概念不同。我不相信有可能重载 +、-、[] 等运算符。

可能的解决方案

于 2009-04-24T22:00:57.250 回答
9

对于 PHP 5.0+ 中的简单干净的解决方案,您需要实现ArrayAccess接口并覆盖函数 offsetGet、offsetSet、offsetExists 和 offsetUnset。您现在可以像使用数组一样使用该对象。

示例(在 PHP7+ 中):

<?php
class A implements ArrayAccess {
    private $data = [];

    public function offsetGet($offset) {
        return $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"
于 2014-06-03T09:09:19.147 回答
1

它似乎不是该语言的功能,请参阅此错误。但是,看起来有一个可以让您进行某种重载。

于 2009-04-24T22:02:16.110 回答
-1

简单地说,不;我建议如果你认为你需要 C++ 风格的重载,你可能需要重新考虑你的问题的解决方案。或者也许考虑不使用 PHP。

套用 Jamie Zawinski 的话说,“你有一个问题并想,'我知道!我将使用运算符重载!' 现在你有两个问题。”

于 2009-04-25T02:45:54.600 回答