是否有可能在PHP中重载运算符?

cha*_*dgh 62 php operator-overloading

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

cbe*_*eer 53

如果您正在使用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;
Run Code Online (Sandbox Code Playgroud)

  • -1使用ArrayAccess接口.不要扩展ArrayObject.你继承了很多你可能不需要的逻辑,而且ArrayObject的扩展在很多方面都是不可预测的,因为涉及到很多魔法. (61认同)
  • 不是一个有用的答案或正确的答案.问题是关于运算符重载,而不是是否存在具有名为ArrayObject的对象的库. (13认同)
  • 不仅是一个有用的答案,而是正确的答案.我一直使用ArrayObjects,这是一种优雅的方式,不仅可以覆盖数组,还可以扩展整个对象模型,并使PHP引发一些严重的问题. (5认同)
  • NikkiC,你的答案可能要好得多,你不应该把它作为真正的答案添加吗? (2认同)

小智 26

实际上,最佳解决方案是实现ArrayAccess接口的四种方法:http://php.net/manual/en/class.arrayaccess.php

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

  • +1。实现 ArrayAccess 接口是解决 OP 问题的唯一有效方法。所有其他都是次优的。 (2认同)

gra*_*r31 21

PHP的重载和运算符概念(参见重载数组运算符)与C++的概念不同.我不相信有可能重载运算符,如+, - ,[]等.

可能的解决方案


Fab*_* Sa 8

对于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"
Run Code Online (Sandbox Code Playgroud)

  • 这是关于OP问题的最佳(最准确)答案。如果您只想在对象上使用“[]”运算符,那么实现“ArrayAccess”接口是最佳选择。 (2认同)