TL;DR
このようにオーバーライド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);
}
魔法のように機能するようです。
2 番目の停留所: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()
ですか?- およびの定義に
exchangeArray()
nextの定義を追加すると、オブジェクトを追加するすべての関数を使用できますか?append()
offsetSet()