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

时间:2009-04-24 21:46:54

标签: php operator-overloading

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

6 个答案:

答案 0 :(得分:52)

如果你使用的是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;

答案 1 :(得分:25)

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

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

答案 2 :(得分:21)

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

可能的解决方案

答案 3 :(得分:8)

对于PHP 5.0+中的简单而干净的解决方案,您需要实现ArrayAccess interface并覆盖函数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"

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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

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