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

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

如果你正在使用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; 

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

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

PHP的重载和运算符的概念(请参阅重载和数组运算符 )不像C ++的概念。 我不相信有可能超载运算符,如+, – ,[]等。

可能的解决scheme

  • 实现SPL ArrayObject (如cbeer所述 )。
  • 实现Iterator (如果ArrayObject对你来说太慢)。
  • 使用PECL运算符扩展(如Benson所述 )。

对于PHP 5.0+中的一个简单而干净的解决scheme,您需要实现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" 

看起来不是该语言的一个特点,看到这个bug 。 不过,看起来有一个包可以让你做一些重载。

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

为了解释Jamie Zawinski,“你有一个问题,想想,'我知道,我会用运算符重载! 现在你有两个问题。“