PHP에서 객체의 속성을 삭제할 수 있습니까?


196

내가 stdObject말을하면 $a.

새 속성을 할당하는 데 아무런 문제가 없습니다 $a.

$a->new_property = $xyz;

그러나 제거하고 싶습니다 unset. 여기서 도움이되지 않습니다.

그래서,

$a->new_property = null;

그런 종류입니다. 그러나 더 '우아한'방법이 있습니까?


unset으로 어떻게 시도했는지 코드를 게시 할 수 있습니까? 내 의미 상 unset이 작동해야하지만 상황을 복제 할 수도있다
Arshdeep

실제로 unset ()이 null보다 더 우아하다는 것을 확신 할 수 없지만 그저
Robert Sinclair

답변:


355
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

1
@danorton 왜 누군가가 그들의 올바른 생각 array으로 object? PHP가 허용하는 경우에도 의미가 없습니다. 나는 이것에 대해 논평함으로써 나쁜 프로그래밍 습관을 장려하고 확산시키지 않을 것이다 :)
Yanick Rochon

8
@YanickRochon 이것은 두 가지 객체의 속성을 병합하려는 경우 의미가 있습니다 (방법이없는 경우 저장 매체로 사용됨).이 경우 가장 빠르고 간단한 경로는 두 객체를 모두 배열로 변환하여 array_replace_recursive를 적용하는 것입니다 () 후 개체에 다시. 누군가가 객체를 사용하여 속성 만 저장하는 이유에 관해서는 MySQL과 같은 데이터베이스에서 배열 대신 객체로 레코드를 가져 오는 응용 프로그램에서 종종 발생합니다 (mysql_fetch_object ()와 같은 표준 함수 사용).
gaborous

1
@danorton FYI, 7.2 이후 unset($o->{0});또는 을 (를) 수행 할 수 있습니다 $k = 0; unset($o->$k);.
사케

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 Joras

1

객체를 반복하는 경우에도 작동합니다.

unset($object->$key);

대괄호를 사용할 필요가 없습니다.


2
이 질문은 @YannickRochon의 것과 비교하여 새로운 것을 추가하지 않습니다.
helvete
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.