具体来说,我想创建一个Array类,并希望重载[]运算符。
答案 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的重载和运算符概念(参见Overloading和Array Operators)与C ++的概念不同。我不相信有可能重载运算符,如+, - ,[]等。
可能的解决方案
ArrayObject
对您而言太慢)。答案 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)
答案 5 :(得分:0)
简单地说,不;我建议如果你认为你需要C ++风格的重载,你可能需要重新思考你的问题的解决方案。或者考虑不使用PHP。
用Jamie Zawinski的话来说,“你有一个问题,想一想,'我知道!我会用运算符重载!'现在你有两个问题。“