Question
の仕事で大きなリファクタリングの期間の途中で私はしたい紹介 stdClass * 関数からデータを返す方法として、私の意思決定をサポートするために, 非引数を見つけるしようとしている
。
あるような場合でしょう最高の他のではなく 1 つを使用する任意の状況では?
StdClass の配列の代わりに使用するにはどのような利点得るため?
いくつかの機能が少ししなければならないことだと思います、1 つの単一値を返すことができる特定。StdClass を使用する私の決定は一時的である長期上の各プロセスの適切な値オブジェクトを見つけるしたいとします
。
答え
通常のアプローチは
-
固定枝で定義されたデータ構造を返すときにオブジェクトを使用して:
$person -> name = "John" -> surname = "Miller" -> address = "123 Fake St"
-
リストを返す場合、配列を使用する:
"John Miller" "Peter Miller" "Josh Swanson" "Harry Miller"
-
オブジェクトの配列を使用して構造化された情報のリストを返す場合:
$person[0] -> name = "John" -> surname = "Miller" -> address = "123 Fake St" $person[1] -> name = "Peter" -> surname = "Miller" -> address = "345 High St"
オブジェクトは常にそれらに対処するキーを必要とするので、データのリストを保持するために適切な。配列は、両方の機能 – ホールドの任意のリスト、およびデータ構造を満たすことができます。
したがって、使えます連想配列オブジェクト上の最初と 3 番目の例は、したい場合。私は本当にただ様式および好みの質問だと言うでしょう。
@Deceze オブジェクト (検証型チェックや将来のメソッド) を使用するときに良い点の数になります
。
答え
による
stdClass
配列と同じ機能を達成するために非常に有用な私見ではない、それちょうど任意の真のメリットなしオブジェクトのオーバーヘッドが追加されます。あなたも逃している多くの有用な配列関数 (例えば
array_intersect
)。少なくとも型チェックを有効にするクラスを作成またはオブジェクトを使用して価値があるオブジェクトにメソッドを追加する必要があります
。
答え
を唯一の目的は 、関数呼び出しから複数の任意のデータ型を返す 限り、配列を stdClass を使用しての合理的な利点があるとは思わない
。
ネイティブ技術的に複数の値を返すことはできませんので、PHP で利用可能なすべての他のデータ型が保持できるコンテナーを使用する必要があります。オブジェクトまたは配列のいずれかになることです
。
function fn1() { return array(1,2); }
function fn2() { return array('one' => 1, 'two' => 2); }
function fn3() { return (object) array(1,2); }
function fn4() { return (object) array('one' => 1, 'two' => 2); }
上記のすべてが働くでしょう。配列は、取るに足らないほんの高速と入力する手間が省けます。それもにはっきり定義された目的を対照的に (これはビット wishywashy ではない) 汎用 stdClass。両方だけがある暗黙のインターフェイス ドキュメントまたは関数本体にが含まれます知っているを見てする必要がありますので
かどうか任意のコストでオブジェクトを使用する場合、 ArrayObject や SplFixedArray を使用してが場合、Api を見て思いますランダムな複数の値を返すという単純なタスクの彼らの機能が必要なですか?そうは思いません。誤解しないでくださいしかし: stdClass を使用する場合は、それを使用し。それはないそれは何かを破るでしょうです。しかし、また何かを得るしないでしょう。少なくともいくつかの利点を追加するにはこれを使ってをという別のクラスを作成できます。
タグの単純なクラスがあることができる
class ReturnValues {}
または何かより高機能な
class ReturnValues implements Countable
{
protected $values;
public function __construct() { $this->values = func_get_args(); }
public function __get($key) return $this->values[$key]; }
public function count() { return count($this->values); }
}
確かに、そんなことし、それから値を取得するにはまだ少なくとも、暗黙インターフェイスを通じてクラスは今より明確に定義された責任を持ちます。この特定の操作用の ReturnValue オブジェクトを作成し、それらの明示的なインターフェイスを与えるクラスから機能を拡張できます:
class FooReturnValues extends ReturnValues
{
public function getFoo() { return $this->values['foo']; }
public function getBar() { return $this->values['foo']; }
}
開発者だけが見ています API を複数値 foo() が返すことが知っている今。もちろん、複数の値を返す可能性のある各操作のためのコンクリートの ReturnValue クラスを記述することになるかもしれない退屈すぐ。個人的に、私はこの初期の目的のために overengineered を見つけます。
とにかく、理にかなっていることを願っています
。
答え
まあ、3 の違いがある:
- がある、アイデンティティ、既定 値で は、配列引数を渡すことのオブジェクトを 共有することによって呼び出す 理由です
- が意味論的違いがあります。オブジェクトを使用する場合、コードを読む人全員を理解し、こと、値を表し、モデル エンティティのいくつかの並べ替え配列は、コレクションやマップとして動作するはずです
- 最後に、リファクタリング signifficantly 簡単になります。StdClass ではなく、具体的なクラスを使用する場合すべてのあなたは別のクラスのインスタンスを作成します。これは、メソッドを追加することもできます
。
。
greetz
back2dos
答え
私は stdClass オブジェクト配列上有用見つけるクリーンと多少文章のようなコードを保持する必要がある場合が読める。例えば関数
getProperties()
と言うデータ (名前、年齢、性別) 人物についてプロパティのセットを返します。
getProperties()
返されるプロパティの 1 つを使用する場合は連想配列を返す場合、は、2 つの命令を記述します:
$data = getProperties();
echo $data['name'];
その一方で、
getProperties()
、stdClass を返す場合しを書くことができることでちょうど 1 つの命令:
echo getProperties()->name;
答え
だけ客観的信任投票を見つけることがある:
json_decode
既定の stdClass 私たちユーザランドの人間が同様の状況において stdClass を使用してください
。
答え
配列対 stdclass のテストで彼ら方法 php ハンドル動的プロパティが遅くして連想配列です。マイクロ最適化を主張するこの言わないよはむしろこれを行うにあなたのより良い行くオフ、dataclass メソッドを持たない定義する public 設定プロパティ。Php 5.4 + を使用している場合は、Esp。ボンネットの下に定義されたプロパティはないハッシュ テーブルで c 言語の配列に直接マップされた場所のものはハッシュ テーブルを使用する必要があります動的
。
これは後であらゆる主要なインターフェイスの手直しすることがなく、完全なクラスになることの追加ボーナスがあります
。