具体来说,我想创建一个 Array 类并想重载 [] 运算符。
问问题
47240 次
6 回答
54
如果您使用的是 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;
于 2009-04-24T22:06:01.497 回答
28
其实最优方案是实现ArrayAccess接口的四个方法:http: //php.net/manual/en/class.arrayaccess.php
如果您还想在“foreach”的上下文中使用您的对象,则必须实现“迭代器”接口: http ://www.php.net/manual/en/class.iterator.php
于 2011-12-15T09:06:42.430 回答
9
对于 PHP 5.0+ 中的简单干净的解决方案,您需要实现ArrayAccess
接口并覆盖函数 offsetGet、offsetSet、offsetExists 和 offsetUnset。您现在可以像使用数组一样使用该对象。
示例(在 PHP7+ 中):
<?php
class A implements ArrayAccess {
private $data = [];
public function offsetGet($offset) {
return $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"
于 2014-06-03T09:09:19.147 回答
-1
简单地说,不;我建议如果你认为你需要 C++ 风格的重载,你可能需要重新考虑你的问题的解决方案。或者也许考虑不使用 PHP。
套用 Jamie Zawinski 的话说,“你有一个问题并想,'我知道!我将使用运算符重载!' 现在你有两个问题。”
于 2009-04-25T02:45:54.600 回答