質問
PHPの最近の更新において、それらは
などArrayAccessの、イテレータ、可算として、オブジェクトが配列として扱うことを可能にする様々なインターフェイスに加え私の質問は、それはその後、以下は動作するはずという意味になるだろうされます:
function useArray(array $array)
{
print_r($array);
}
useArray(new ArrayObj(array(1,2,3,4,5));
$array
は技術的配列でないように、は、今のように、PHPは、タイプ・ヒンティングエラーをスローします。しかし、アレイにそれが基本的に同じになり、すべてのインターフェイスを実装します。
echo $array[0]; // 1
$array[0] = 2;
echo $array[0]; // 2
論理的に、オブジェクトは、それがアレイと同じインタフェースを実装するように、アレイを使用することができるどこでも使用することができなければならない。
私は私のロジックで混乱しています、またはそれは、オブジェクトが配列と同じインタフェースを実装している場合、すべて同じ場所で使用することができるはずという理にかなっていますか?
解決
しないのオブジェクト - - などが任意のインタフェースを実装していない私は私のロジックで混乱しています、またはそれをしません 理にかなっているオブジェクトの場合 同じインタフェースを実装 配列は、で使用されることができるはずです すべて同じ場所?
array
特別なPHP変数型です。 ArrayObject
は、多数のインタフェース(Countable
、ArrayAccess
、等)を実装し、(foreachループのように)特定の場合において、アレイのように作用することを目的とする可能本格的なオブジェクトです。彼らはのと同じように動作します。
PHPは、複数の機能シグネチャをサポートするための理想的な解決策は次のようになります。
function useArray(array $array) { }
function useArray(ArrayObject $array) { }
しかし、私たちはあなただけの関数定義外の変数の型をチェックする必要があります(私たちが今までそれを取得する場合)ことを得るまでます:
function useArray($array) {
if (is_array($array) || $array instanceof ArrayObject) {
// Do some stuff
} else {
throw new Exception('I require an array or an array-like structure!');
}
}
またはarray
引数を指定して$array
型ものを行うとuseArray
が発生する可能性のある警告/エラーを処理しようとします。
他のヒント
あなたのタイプヒンティングは「ArrayObj」
でそのタイプの「アレイ」が、あなたの合格を述べていますfunction useArray(array $array)
...
useArray(new ArrayObj
そうそうその文句しようとしてます。
オブジェクトが別のクラスと同じインタフェースを実装している場合は、私は私のロジックで混乱しています、またはそれをしません 理にかなっているオブジェクトの場合 同じインタフェースを実装 配列は、で使用されることができるはずです すべて同じ場所?
、ええ、あなたがそれらを相互交換可能に使用することができますが、それはまだ有効なコンパイラがない同じタイプのため、あなたのタイプヒンティング文句を言うために。
2つのオブジェクトが同じインターフェイスを実装するという理由だけで、彼らは同じ種類のものであるという意味ではありません。