PHP에서 빈 값으로 기본 개체를 생성합니까?
On 12월 1, 2020 by admin다음 코드를 고려하세요.
$car = (object)[ "general" => [ "interior" => [ "seats" => "destroyed" ] ] ]; $exteriorProperties = [ "hood" => "shiny", "windows" => "dirty" ]; foreach($exteriorProperties as $key => $prop){ $car->{"other"}->{"exterior"}->{$key} = $prop; }
이 시나리오는 다른 데이터를 반복하면서 한 번에 몇 개의 레이어 씩 객체에 속성을 추가하는 것을 좋아합니다. 존재하지 않으면 생성하고 무시합니다. 완벽합니다!
안타깝게도 다음과 같은 경고가 표시됩니다.
빈 값에서 기본 개체 만들기
재산이 다음과 같이 존재하는지 먼저 확인하여 문제를 해결할 수 있습니다.
foreach($exteriorProperties as $key => $prop){ if(!isset($car->other)) $car->other = (object)[]; if(!isset($car->other->exterior)) $car->other->exterior = (object)[]; $car->other->exterior->{$key} = $prop; }
이상적인 것이 아닙니다. 해결책. 좀 더 우아한 해결책이 있는지 궁금합니다. 현재는 다음을 사용하고 있습니다.
@$car->{"other"}->{"exterior"}->{$key} = $prop;
경고를 표시하지 않지만 향후 호환성이 걱정됩니다.
누구든지이 시나리오에 대한 더 우아한 솔루션을 가지고 있습니까?
댓글
- 배열을 사용하지 마십시오 ' 아래 대답은 개체를 올바르게 사용하십시오. 배열은 로컬 코드에만 유용하며 파일 또는 클래스 외부에서 공유된다는 것은 키를 수동으로 작성하고 기억해야하고, 하나 또는 두 개를 놓치고 오타를 놓친다는 것을 의미합니다. 자동 완성 기능이있는 좋은 IDE와 getter / setter가있는 개체는 행복한 개발 환경입니다.
Answer
예, 배열을 사용합니다.
$car = [ "general" => [ "interior" => [ "seats" => "destroyed" ] ] ]; $exteriorProperties = [ "hood" => "shiny", "windows" => "dirty" ]; foreach($exteriorProperties as $key => $prop){ $car["other"]["exterior"][$key] = $prop; } $car = (object) $car;
어쨌든 객체 변환은 가장 바깥 쪽 배열 만 변환합니다. 중첩 된 배열은 여전히 배열입니다.
\is_array($car->general); // true
어쨌든 모양이없는 개체 여야하는 이유는 무엇입니까? 이러한 객체에 대한 클래스를 정의하거나 배열로 처리하는 것이 간단한 대답입니다.
Btw $car->{"other"}
는 $car->other
…
댓글
- 당신이 ' 당신이 맞다고 생각합니다. 항상 배열에 고정되는 것을 싫어합니다.
$car->{'other'}
는 대부분의 속성 키가 문자열 변수에서 나오기 때문입니다. 예 :$car->{$var1}->{$var2}
답변
예, 피할 수 있습니다. 모든 데이터를 배열로 처리하여 반복 된 조건부 연산.
코드 : ( 데모 )
$car = json_decode( json_encode( array_replace_recursive( (array)$car, ["other" => ["exterior" => $exteriorProperties]] ) ) );
객체 유형에서 배열 유형으로 최상위 레벨 만 다룰 때 (array)
로 캐스트 할 수 있습니다. 모든 레벨을 변환해야하는 경우-json은 전체 객체를 인코딩 한 다음 해당 문자열을 배열로 디코딩합니다. 처리가 완료되면 json_
함수를 사용하여 데이터를 객체 유형으로 되돌립니다.
아직도이 작업이 약간 어색함을 느낍니다 (아마도 조건부 접근). 위의 이점은 재귀입니다. 데이터 깊이가 변경되면 처리 스크립트를 변경할 필요가 없습니다. 객체를 실제로 사용해야하는지 자문 해보십시오. 다른 데이터 유형으로 코딩이 단순화 된 경우 다시 생각해보십시오. / refactor.
Ps는 반드시 stfu 연산자 (@
)를 코드에 작성하지 마세요. 거의 모든 구현에서이 기술은 피할 수 있으며 (이러한 경우 중 하나) 이러한 구문을 가진 프로젝트는 지식이 풍부한 개발자에 의해 저품질로 분류 / 추정됩니다.
댓글
- 감사합니다. 좋은 평가입니다. 불행히도 이전 프로그래머가 그렇게 코딩했기 때문에 객체 외에는 아무것도 선택할 수 없었습니다.
답글 남기기