必要な SPL インターフェースをすべて実装することで、実際の PHP 配列と事実上見分けがつかないクラスを作成することは可能でしょうか? 彼らは重要な何かを見逃していませんか?
より高度な Array オブジェクトを構築したいと考えていますが、配列をカスタム Array クラスに置き換えた場合に、あらゆる場所で配列を使用する既存のアプリを壊さないようにしたいと考えています。
私が考えることができる唯一の問題は、gettype() および is_array() 関数です。コードを確認してください
gettype($FakeArray) == 'array'
is_array($FakeArray)
オブジェクトは配列と同じように使用できますが、それでもオブジェクトとして識別されるためです。
上記のポイントに加えて、ユーザースペース配列型のヒントをクラスのインスタンスで機能させることはできません。例えば:
<?php
function f(array $a) { /*...*/ }
$ao = new ArrayObject();
f($ao); //error
?>
出力:
Catchable fatal error: Argument 1 passed to f() must be an array, object given
その他の違いには、配列の「+」演算子(マージ)と、一般的に使用される関数とを含む関数全体の失敗が含まarray_*
れます。array_merge
array_shift