TL;博士
我想这样重写:offsetSet($index,$value)
但它会产生一个致命错误(“声明必须兼容”)。ArrayObject
offsetSet($index, MyClass $value)
什么为什么
我正在尝试创建一个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) {}
我的版本:
/**
* @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()
呢? - 如果我在 and 的旁边添加了 next 的定义,我是否拥有添加对象的所有
exchangeArray()
功能?append()
offsetSet()