是否有可能在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,“你有一个问题,想想,'我知道,我会用运算符重载! 现在你有两个问题。“