web-dev-qa-db-ja.com

オブジェクト作成時にstdClassオブジェクトの属性を設定する方法

stdClassオブジェクトの属性を単一のステートメントで設定したい。私はそれについて全く知りません。次のことを知っています

$obj = new stdClass;
$obj->attr = 'loremipsum';

2つのステートメントが必要です。

$obj = (object) array('attr'=>'loremipsum');

単一のステートメントを取りますが、直接的な方法ではありません。

$obj = new stdClass(array('attr'=>'loremipsum'));

動作していません。

39
Habeeb Perwad
$obj = (object) array(
    'attr'=>'loremipsum'
);

実際、それは得ようとしていることと同じくらい直接的です。カスタムコンストラクターでさえ、単一の式でこれを行うことはできません。

(object) cast might実際には配列からの単純な変換になります。これは、プロパティも内部的にハッシュに保存されるためです。

次のような基本クラスを作成できます。

abstract class MyObject
{
    public function __construct(array $attributes = array())
    {
        foreach ($attributes as $name => $value) {
            $this->{$name} = $value;
        }
    }
}

class MyWhatever extends MyObject
{
}

$x = new MyWhatever(array(
    'attr' => 'loremipsum',
));

ただし、これを行うとコンストラクターがロックされ、オーバーライドされると各クラスがその親コン​​ストラクターを呼び出す必要があります。

57
Ja͢ck

Ja͢ckは良い答えを提供しますが、PHPインタープリター自体が オブジェクトまたは変数を適切に表現する方法

_php > $someObject = new stdClass();
php > $someObject->name = 'Ethan';
php > var_export($someObject);
stdClass::__set_state(array(
   'name' => 'Ethan',
))
_

興味深いことに、_stdClass::__set_state_を使用するとstdClassオブジェクトの作成に失敗するため、そのように表示される可能性が高い var_export() のバグ)。 ただし、オブジェクトの作成時に設定された属性を使用してstdClassオブジェクトを作成する簡単な方法はないことを示しています。

5
dotancohen
        foreach ($attributes as $name => $value) {
            if (property_exists(self::class, $name)) {
                $this->{$name} = $value;
            }
        }

属性が存在しない場合、返されたオブジェクトのprint_r(get_object_vars($ obj))を使用すると任意の属性が設定されるため、最もクリーンです。

1
Hydtek