3

時々私は配列をオブジェクトに変換するために__getまたはを使用します。しかし、私は固執するべきだと決めることはできません。どちらがより良く、より速いのだろうか、何かアイデアはありますか?stdClass

class property 
{

    public function __get($name)
    {
        return (isset($this->$name)) ? $this->$name : null;
    }
}

$object = new property();
$object = new stdClass();

したがって、を使用するnew property()と、プロパティオブジェクトが出力されます。

property Object
(
....
)

一方、を使用するnew stdClass()と、stdClassオブジェクトが出力されます。

stdClass Object
(
....
)

だから私はこのようなオブジェクトデータを取得することができます$item->title

編集:

実際の配列からオブジェクトへの変換を行う方法。

public function array_to_object($array = array(), $property_overloading = false)
    {

        # If $array is not an array, let's make it array with one value of former $array.
        if (!is_array($array)) return $array;

        # Use property overloading to handle inaccessible properties, if overloading is set to be true.
        # Else use std object.
        if($property_overloading === true) $object = new property();
            else $object = new stdClass();

        foreach($array as $key => $value)
        {
            $key = (string) $key ;
            $object->$key = is_array($value) ? self::array_to_object($value, $property_overloading) : $value;
        }

        return $object;
    }
4

2 に答える 2

3

まず、あなたが持っているような(ほとんど)空のクラス定義はほとんどのようであるstdClassため、どちらを使用しても大きな問題は発生しません。

とはいえ、「名前付き」クラスの利点の1つは、魔法のメソッドstdClassを利用して、存在しないプロパティにアクセスしたときに何が起こるかを定義できることです。__get

class property
{
   public function __get($name)
   {
       return null;
   }
}

上記は、元のpropertyクラスをより簡単に書き直したものです。が呼び出されたとき、それが設定されていない__get()ことはすでにわかってい$this->$nameます。$obj->bla->blaこれによって通知が発生することはありませんが、存在しない場所を参照しようとしたときに致命的なエラーが発生するのを防ぐことはでき$obj->blaません。

存在しないプロパティにアクセスしているときに例外をスローする方が便利な場合があります。

class property
{
   public function __get($name)
   {
       throw new Exception("Property $name is not defined");
   }
}

これにより、スクリプトが完全に停止する致命的なランタイムエラーになる前に、コードで例外をキャッチできます。

于 2012-11-14T09:28:12.503 に答える
0

「property」クラスをダムデータコンテナとして使用する場合は、stdClassまたは配列を使用してください。

于 2012-11-14T01:27:24.353 に答える