stdClassオブジェクトの属性を単一のステートメントで設定したい。私はそれについて全く知りません。次のことを知っています
$obj = new stdClass;
$obj->attr = 'loremipsum';
2つのステートメントが必要です。
$obj = (object) array('attr'=>'loremipsum');
単一のステートメントを取りますが、直接的な方法ではありません。
$obj = new stdClass(array('attr'=>'loremipsum'));
動作していません。
$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',
));
ただし、これを行うとコンストラクターがロックされ、オーバーライドされると各クラスがその親コンストラクターを呼び出す必要があります。
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オブジェクトを作成する簡単な方法はないことを示しています。
foreach ($attributes as $name => $value) {
if (property_exists(self::class, $name)) {
$this->{$name} = $value;
}
}
属性が存在しない場合、返されたオブジェクトのprint_r(get_object_vars($ obj))を使用すると任意の属性が設定されるため、最もクリーンです。