17

私は長い間、関連するフィールドを格納するために配列を使用してきました。関連するユーザー フィールドが必要な場合は、次を使用しました。

$user = array(
   'id' => 27
   'name' => 'Pepe'
);

しかし、最近はオブジェクトを扱う作業が多く、$user['id'] の代わりに $user->id を使用する方が好きです。

私の質問: オブジェクト指向スタイルを実現するには、stdClass を使用できます。

$user = new stdClass();
$user->id = 27;
$user->name = 'Pepe';

または配列からのキャスト

$user = (object) array(
  'id' => 27
, 'name' => 'Pepe'
);

パフォーマンスとスタイルの順序で、どちらか一方が優れているか、それとも使いたいものをあいまいに使用できますか?

ありがとう!

更新: すべてのコメントに同意します。これは OOP ではなく、関連するデータを構造にグループ化するだけです。私の $user の例は、メソッド、プロパティ、blablabla でクラスを使用する典型的な例であるため、最善ではありません...「initTable」などの構成構造がたくさんあるので、私は尋ねました。

$table => page => init => 1
               => end  => 25
          sort => field => name
               => order => asc

などなど、初期化ページを取得するのに何が良いか知りたいです:

$table->page->init **OR** $table['page']['init']
4

3 に答える 3

10

小さなテスト ( http://phpfiddle.org/lite/code/cz0-hyf ) に基づいて、「new stdClass()」の使用は他のオプションよりも約 3 倍遅いと言えます。

奇妙なことに、配列のキャストは stdClass に比べて非常に効率的に行われます。

ただし、このテストは実行時間のみを測定します。メモリは計測されません。

PSコードを共有するためだけにphpFiddleを使用しました。テストは私のローカル PC で行われました。

于 2013-09-05T15:56:40.630 に答える
8

問題を調査してみてください。ここでは、それぞれ 1.000.000 回ずつ実行するテストを示します。

$start = microtime(true);
for ($i=0;$i<1000000;$i++) {
    $user = new stdClass();
    $user->id = 27;
    $user->name = 'Pepe';
}
$end = microtime(true);
echo $end - $start;

echo '<br><br>';

$start = microtime(true);
for ($i=0;$i<1000000;$i++) {
    $user = (object) array(
        'id' => 27, 
        'name' => 'Pepe'
    );
}
$end = microtime(true);
echo $end - $start;

レポート

0.75109791755676
0.51117610931396

どうやらこの特定のケースでは、配列からキャストするのが最速の方法です。stdClass多くのパーセントでビートします。しかし、私はそれを一般的な普遍的な規則や法律とは考えていません。

于 2013-09-05T15:54:44.823 に答える
4

配列を標準オブジェクトに移動しても違いはないと思います。array_*ただし、ほとんどの機能が使用できなくなります。
インデックス付き配列よりも動的オブジェクトを使用する利点がわかりません。

この場合、必要な要素とプロパティごとにクラスを作成します。

class User
{
    protected $id;
    protected $name;

    public function __construct($id = null, $name = null)
    {
        $this->id   = $id;
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }
}

このような設計では、どのようなパラメータがあるかを正確に把握できます。

$user  = new User(21, 'Foo');
echo $user->getName(); // Foo

$blank = new User(22);
echo $blank->getName(); // NULL

エラーもチェックもありません。orを
使用すると、そのようなものになりますarraystdClass

$user = array('id' => 21, 'name' => 'Foo');
echo $user['name']; // Foo

$blank = array('id' => 22);
echo $blank['name']; // NOTICE: Undefined offset
echo isset($blank['name']) ? $blank['name'] : null; // NULL

この種の動作では、インターフェイスがわかっているソリッド オブジェクトを使用することで、保守や調整が容易になります。

于 2013-09-05T15:56:06.180 に答える