PHPは混合パラダイム言語であり、配列などの非オブジェクトデータ型を使用して返すことができます。特定の状況でどのプログラミング構成を使用するかを決定する際に、配列とオブジェクトの選択に関するいくつかのガイドラインを明確にしようとする質問を投げかけます。
これは、PHP言語の構造を使用してデータをエンコードする方法と、データの受け渡しの目的(つまり、サービス指向アーキテクチャまたはWebサービス)で他の方法を選択する可能性が高い場合についての質問です。
例
{cost、name、part_number、item_count}で構成されるアイテムタイプがあるとします。プログラムでは、そのようなアイテムタイプをいくつか表示する必要があります。ここでは、各アイテムタイプを保持する外部コンテナとして配列を使用することにします。[PHP ArrayObject
をオブジェクト指向パラダイムに使用することもできますが、私の質問はその(外部)配列に関するものではありません]。私の質問は、アイテムタイプデータをエンコードする方法と、使用するパラダイムについてです。PHPでは、PHP Native Arrays
またはを使用できますPHP Objects
。
このようなデータは、次の2つの方法でエンコードできます。
//PHP's associative arrays:
$ret = array(
0 => array(
'cost' => 10.00,
'name' => 'item1',
'part_number' => 'zyz-100',
'item_count' => 15
),
1 => array(
'cost' => 34.00,
'name' => 'item2',
'part_number' => 'abc-230',
'item_count' => 42
),
);
対
//here ItemType is encapsulated into an object
$ret = array(
0 => new ItemType(10.00, 'item1', 'zyz-100', 15),
1 => new ItemType(34.00, 'item2', 'abc-230', 42),
);
class ItemType
{
private $price;
private $name;
private $partNumber;
private $itemCount;
function __construct($price, $name, $partNumber, $itemCount) {..}
}
私が考えていること
配列エンコードは軽量で、JSONに対応していますが、混乱しやすくなっています。連想配列キーの1つのスペルを間違えると、キャッチするのがより難しいエラーが発生する場合があります。しかし、気まぐれに変更するのも簡単です。item_count
これ以上保存したくない場合、テキスト処理ソフトウェアを使用item_count
して、配列内のすべてのインスタンスを簡単に削除し、それに応じてそれを使用する他の関数を更新できます。それは退屈なプロセスかもしれませんが、簡単です。
オブジェクト指向エンコーディングは、IDEおよびPHP言語機能を呼び出し、エラーを事前に簡単にキャッチできるようにしますが、そもそもプログラミングとコーディングが困難です。オブジェクトについて少し考え、先に考えなければならず、OOコーディングは配列構造を入力するよりも少し認知的な負荷がかかるので、私はもっと難しいと言います。とはいえ、一度コード化されると、ある意味では、いくつかの変更の実装がより簡単にitem_count
なる可能性があります。たとえば、を削除すると、変更するコード行が少なくなります。しかし、より高いレベルのオブジェクト指向機能が関係するため、変更自体は配列メソッドと比較して高い認知負荷を必要とする場合があります。
質問
データを操作する必要がある場合など、場合によっては明確です。しかし、「アイテムタイプ」データを数行だけ保存する必要がある場合、配列を使用するかオブジェクトを構築するかを決定する際に明確なガイドラインや考慮事項がありません。コインを投げて、コインを選ぶことができるようです。それはここですか?
array
、2: User-defined Class
、3: stdClass
。速度の面でのパフォーマンスはarray
、aとUser-defined class
(a などItemType
)を比較する場合とほぼ同じですが、定義されたclass
esはarray
s を使用するよりも少ないメモリを使用する傾向があります。stdClass
一方、3つのオプションの中で最も遅く、またほとんどのメモリを使用します。
(object)['foo'=>'bar']
。結果の値はclassを持ちStdClass
、全体でJSONエンコードされjson_encode()
、プロパティは配列インデックスと同じくらい簡単に名前を変更できます(変数を介して間接的にアクセスされる場合、これは必ずしも簡単ではありません)。ただし、このような値にはさまざまな操作があります。たとえば、配列共用体があるためオブジェクト共用体はなく、array_*()
関数を直接使用することはできません。