简述
我想覆盖 ArrayObject
中的 offsetSet($index,$value)
方法,像这样: offsetSet($index, MyClass $value)
,但会生成一个致命错误("declaration must be compatible")。
什么及为什么
我正在尝试创建一个 ArrayObject
子类,强制所有值都是某个对象。我的计划是通过覆盖添加值的所有函数并给它们一个类型提示来实现,这样你就不能添加任何不是 MyClass
值的东西
如何操作
首先: append($value);
来自 SPL:
/**
* Appends the value
* @link http://www.php.net/manual/en/arrayobject.append.php
* @param value mixed <p>
* The value being appended.
* </p>
* @return void
*/
public function append ($value) {}
My version:
/**
* @param MyClass $value
*/
public function append(Myclass $value){
parent::append($value);
}
看起来非常顺利。
第二步:offsetSet($index,$value);
同样来自SPL:
/**
* Sets the value at the specified index to newval
* @link http://www.php.net/manual/en/arrayobject.offsetset.php
* @param index mixed <p>
* The index being set.
* </p>
* @param newval mixed <p>
* The new value for the index.
* </p>
* @return void
*/
public function offsetSet ($index, $newval) {}
我的版本:
/**
* @param mixed $index
* @param Myclass $newval
*/
public function offsetSet ($index, Myclass $newval){
parent::offsetSet($index, $newval);
}
然而,这会产生以下致命错误:
你可以在这里看到一个不能正常工作的版本 如果我像这样定义它,就可以了:致命错误:Namespace\MyArrayObject::offsetSet()的声明必须与ArrayAccess::offsetSet()相兼容
public function offsetSet ($index, $newval){
parent::offsetSet($index, $newval);
}
问题
- 为什么覆盖
offsetSet()
不适用于上面的代码,而append()
适用? - 如果我在
append()
和offsetSet()
的定义旁边添加exchangeArray()
的定义,那么我是否拥有添加对象的所有函数?