PHPでオブジェクトのプロパティを削除することは可能ですか?


193

私が持っている場合はstdObject、発言権を$a

もちろん、新しいプロパティを割り当てても問題はありません$a

$a->new_property = $xyz;

しかし、それを削除したいので、unsetここでは役に立ちません。

そう、

$a->new_property = null;

そのようなものです。しかし、もっと「エレガントな」方法はありますか?


unsetでどのように試したかをコードに投稿できますか?私の感覚ではunsetは機能するはずです。しかし、おそらくあなたはコンテキストを複製しています
Arshdeep

unset()が= nullよりもエレガントであるかどうかは本当にわかりませんが、それは私だけかもしれません
Robert Sinclair

回答:


350
unset($a->new_property);

これは、配列要素、変数、およびオブジェクト属性に対して機能します。

例:

$a = new stdClass();

$a->new_property = 'foo';
var_export($a);  // -> stdClass::__set_state(array('new_property' => 'foo'))

unset($a->new_property);
var_export($a);  // -> stdClass::__set_state(array())

10
nb整数キーを持つプロパティを直接設定解除することはできません。例$o=(object)array('a','b','c'); (単にそのようなプロパティにアクセスするには、オブジェクトを(逆に)配列に変換する必要があります!)
danorton

4
@YanickRochon、私のコメントは、objectではなく、についてarrayです。;-)
danorton 2014年

1
@danortonなぜ誰かが正しい心の中でをに変換するarrayobjectですか?(PHPで許可されていても)意味がありません。私はこれについてコメントすることにより、悪いプログラミングの習慣を奨励したり広めたりはしません。
Yanick Rochon、2014年

8
@YanickRochonこれは、2つのオブジェクト(メソッドがなく、記憶媒体としてのみ使用される)のプロパティをマージする場合に意味があります。この場合、最速かつ最も簡単なルートは、両方のオブジェクトを配列に変換してarray_replace_recursiveを適用することです。 ()その後、オブジェクトに戻ります。プロパティを格納するためだけにオブジェクトを使用する理由については、これは、MySQLなどのデータベースからレコードを配列ではなくオブジェクトとしてフェッチするアプリケーションでよく発生します(mysql_fetch_object()などの標準関数を使用)。
2015年

1
@danorton FYI、7.2以降では、unset($o->{0});またはを使用できます$k = 0; unset($o->$k);
Sarke

43

これは、オブジェクトをループしている場合にも特別に機能します。

unset($object[$key])

更新

Fatal error: Cannot use object of type Object as array@CXJで言及されているように、新しいバージョンのPHPは致命的なエラーをスローします。その場合、代わりにブラケットを使用できます

unset($object{$key})

記述されている「新しい」バージョンを指定できますか?私にとって、PHP 7.1ではunset($object[$key])動作しますが、動作しunset($object->{$key})ません(正確には、unset($object['literal_key'])そしてunset($object->{'literal_key'}))。PS Hm、私は間違っているかもしれませんが、編集しているのは配列ではなくオブジェクトであると考えています
YakovL

オブジェクトのコレクションからプロパティを設定解除しません。
Viktor

1

これは、オブジェクトをループしている場合にも機能します。

unset($object->$key);

ブラケットを使用する必要はありません。


2
この質問は、@ YannickRochonの質問と比較して新しいものを追加しません。
2019年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.