93

これは単純でなければなりませんが、答えが見つからないようです....

プロパティのないジェネリック stdClass オブジェクト$fooがあります。$barまだ定義されていない新しいプロパティを追加したいと考えています。私がこれを行う場合:

$foo = new StdClass();
$foo->bar = '1234';

厳密モードの PHP が文句を言います。

既にインスタンス化されたオブジェクトにプロパティを追加する適切な方法 (クラス宣言の外) は何ですか?

注: このソリューションは、stdClass タイプの汎用 PHP オブジェクトで動作するようにしたいと考えています。

この問題の背景を少し。json オブジェクトの配列である json 文字列をデコードしています。 json_decode()StdClass オブジェクトの配列を生成します。これらのオブジェクトを操作し、それぞれにプロパティを追加する必要があります。

4

7 に答える 7

146

プロパティをオブジェクトに絶対に追加する必要がある場合は、それを配列としてキャストし、プロパティを (新しい配列キーとして) 追加してから、オブジェクトとしてキャストし直すことができると思います。stdClassオブジェクトに出くわすのは、配列をオブジェクトとしてキャストするときか、新しいオブジェクトを最初から作成するときだけです(stdClassもちろん、json_decode()何かを忘れてしまったときです!)。

それ以外の:

$foo = new StdClass();
$foo->bar = '1234';

あなたがするだろう:

$foo = array('bar' => '1234');
$foo = (object)$foo;

または、既存の stdClass オブジェクトが既にある場合:

$foo = (array)$foo;
$foo['bar'] = '1234';
$foo = (object)$foo;

また、1 ライナーとして:

$foo = (object) array_merge( (array)$foo, array( 'bar' => '1234' ) );
于 2012-07-23T18:45:45.933 に答える
137

次のようにします。

$foo = new stdClass();
$foo->{"bar"} = '1234';

今試してください:

echo $foo->bar; // should display 1234
于 2015-09-15T08:55:00.893 に答える
11

デコードされたJSONを編集する場合は、オブジェクトの配列ではなく、連想配列として取得してみてください。

$data = json_decode($json, TRUE);
于 2012-07-23T18:57:02.460 に答える
1

魔法のメソッド __Set および __get を使用する必要があります。簡単な例:

class Foo
{
    //This array stores your properties
private $content = array();

public function __set($key, $value)
{
            //Perform data validation here before inserting data
    $this->content[$key] = $value;
    return $this;
}

public function __get($value)
{       //You might want to check that the data exists here
    return $this->$content[$value];
}

}

もちろん、この例を次のように使用しないでください: セキュリティはまったくありません :)

編集:あなたのコメントを見て、ここではリフレクションとデコレータに基づく代替案が考えられます:

 class Foo
 {
private $content = array();
private $stdInstance;

public function __construct($stdInstance)
{
    $this->stdInstance = $stdInstance;
}

public function __set($key, $value)
{
    //Reflection for the stdClass object
    $ref = new ReflectionClass($this->stdInstance);
    //Fetch the props of the object

    $props = $ref->getProperties();

    if (in_array($key, $props)) {
        $this->stdInstance->$key = $value;
    } else {
        $this->content[$key] = $value;
    }
    return $this;
}

public function __get($value)
{
    //Search first your array as it is faster than using reflection
    if (array_key_exists($value, $this->content))
    {
        return $this->content[$value];
    } else {
        $ref = new ReflectionClass($this->stdInstance);

        //Fetch the props of the object
        $props = $ref->getProperties();

        if (in_array($value, $props)) {

        return $this->stdInstance->$value;
    } else {
        throw new \Exception('No prop in here...');
    }
}
 }
}

PS : 私は自分のコードをテストしませんでした。一般的なアイデアだけです...

于 2012-07-23T18:37:53.200 に答える