2011-12-21 3 views
1

객체의 JSON 표현을 위해 객체 속성을 동적으로 만들려고합니다. User 클래스에는 몇 가지 기본 속성이 있습니다 (__construct으로 설정). 나는 객체 지향 스타일을 선호하기 때문에 배열 대신 사용자 정의 객체를 사용하고 있습니다. (또한 사용자 정의 setter/getters 메서드가 필요합니다.)"엄격한 표준 : 빈 값에서 기본 객체 만들기"

그러나 첫 번째 시도는 저를 제공합니다

엄격한 기준 : 빈 값의 기본 객체를 생성합니다. 코드가 실제로 작동하는 (그리고 json_encode 오른쪽 출력을 보여줍니다) 경우에도

:

<?php 

class User 
{ 
    protected $data = array(); 

    public function __set($property, $value) 
    { 
     $this->data[$property] = $value; 
    } 

} 

$u = new User(); 
$u->name = "James Smith"; // Works 
$u->status->active = false; // Fail 
$u->status->modified = time(); 

var_dump(json_encode($u)); 

?> 

나는 전화 $u->status->active이, 재산 $u->status 아직 존재하지 않는 경우 때문에 그것이 생각합니다. 이 문제를 해결하는 방법을 알고 계십니까?

답변

1

나는 그것을 당신을 위해 밖으로 분류했다 : 그것은 흥미 롭다.

먼저 status 속성을 초기화하지 않았습니다. 그래서 이론적으로는 충분했을 것입니다 :

$u->status = new StdClass; 

그러나 이보다 더 복잡합니다. 비록 당신이 그것을하더라도, 그것은 작동하지 않을 것이다. 이는 데이터 배열에서 필드를 설정하기 때문에 발생하지만 절대로 거기에서 벗어나지 못합니다!

그래서 필드에 액세스하면 ($ u-> status) 방금 설정 한 필드를 사용하지 않습니다. 설정되지 않은 개체 속성에 액세스하고 있습니다. 설정 한 후에 $ u-> name을 인쇄하려고하면 데이터 배열을 읽는 getter 함수를 만들지 않았기 때문에 아무 것도 얻을 수 없습니다.

getter를 만들거나 setter를 삭제해야합니다 (어쨌든 작동하지만 필요하지는 않음).

세터를 주석 처리하면 모든 것이 경고없이 작동합니다. 이 단순화 된 버전보기 :

<?php 

error_reporting(E_STRICT); 

class User 
{ 

} 

$u = new User(); 
$u->name = "James Smith"; 
$u->status = new StdClass; // Comment this line and you will get the strict warning 
$u->status->active = false; 

var_dump($u); 
+0

감사합니다. 새로운'stdClass()'문장을 제거 할 수있는 기회 (어쩌면'__set()'사용)? – gremo

+0

글쎄, 당신은 상태 필드를 초기화해야하고, 거기에 객체를 생성해야만 활성 필드를 설정할 수 있습니다. 그래서 이것, 또는 "$ u-> newObjectField ($ fieldName)"와 같은 새로운 함수를 생성하여 fieldName에 새로운 객체를 생성하고 초기화합니다. – Palantir

+0

안녕하세요, 문제를 해결하셨습니까? 이 기능이 유용하다고 판단되면 upvote 또는 accept하십시오. – Palantir

관련 문제