質問

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は、多数のインタフェース(CountableArrayAccess、等)を実装し、(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つのオブジェクトが同じインターフェイスを実装するという理由だけで、彼らは同じ種類のものであるという意味ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top