2013-03-28 10 views
2
$obj = (object)array('a', 'b', 'c'); 
$refl = new \ReflectionObject($obj); 
$props = $refl->getProperties(\ReflectionProperty::IS_PUBLIC | \ReflectionProperty::IS_PROTECTED);  

foreach($props as $prop) 
    print $prop->name; 

인쇄 이상한 이름, line, fileline 같은 (대신 1, 2, 3). 왜? 나는 숫자이기 때문에 이름이 유효하지 않다는 것을 알지만, 왜이 임의의 문자열을 얻습니까?이상한 행동

get_object_vars($obj)은 아무것도 표시하지 않으며 실제로는 print_r((array)$obj)이 올바르게 값을 인쇄합니다.


Reflection에서 숫자 속성을 표시 할 수없는 경우 수정할 수있는 방법이 있습니까?


그것은 또한 많은 SPL interators (같은 ArrayObject의, SplFixedArray의, SplHeap들)에 발생합니다. 분명히이 동작은 일부 PHP 5.3 버전에서만 나타납니다. PHP 5.4는 아무것도 보여주지 않습니다.


Related PHP bug 및 솔루션에 내 걸릴 (property_exists가 유효하지 않은 이름을 무시) :

if(version_compare(PHP_VERSION, '5.4') < 0){ 
    $props = array_filter($props, function($prop) use($obj){ 
    return !$prop->isPublic() || property_exists($obj, $prop->name); 
    }); 
} 
+0

ArrayObjects는 어떻습니까? – sectus

답변

1

It's a won't fix bug... or strange php behavior합니다. 따라서 숫자 키가 확실하지 않은 경우 객체 유형 캐스팅을 사용할 수 없습니다. 당신은 이상한 PHP 동작에서 다른 더러운 트릭을 사용하여이

$obj = new \stdClass(); 
foreach($array as $key=>$value) 
    $obj->{$key} = $value; 

같은 것을 사용합니다. 리플렉션없이 모든 속성 가져 오기

$obj = (object) array('a', 'b', 'c'); 
$obj->{0}='asd'; 
while (list($field, $value) = each($obj)) 
    { 
    var_dump($field, $value); 
    } 

또한이 문제는 stdClass 개체에서만 발생한다고 생각합니다.

+0

ArrayObject, SplFixedArray 등의 모든 Iterator 객체에서도 발생합니다. ( –

+0

@OneTrickPony, 예제를 인쇄 할 수 있습니까? 내 트릭은 어떨까요? – sectus

+0

그것은 내 (배열) 캐스트 솔루션과 같은 방식으로 작동하는 것 같습니다. 추가 인터넷 검색 결과, 5.3의 [버그] (https://bugs.php.net/bug.php?id=49154) 인 것으로 나타났습니다. –

1

객체에 배열을 주조는 값으로 속성 이름에 배열 키 및 값을 변환합니다.

배열에 숫자 키가 있습니다. 개체에 숫자 속성이 있습니다. 어떤 종류의 무효입니다.

당신이 정말로 원하는 :

$obj = (object) array('a'=> null, 'b' => null, 'c'=> null);

+0

숫자 필드 이름은 유효합니다. '$ obj2 = new \ stdClass(); $ obj2 -> { '0'} = 'a'; ' – sectus

+0

PHP에 없습니다. 이것은 구문 오류입니다 :'$ obj-> 2 = "yey";' "구문 오류, 예기치 않은 T_LNUMBER, T_STRING 또는 T_VARIABLE 또는 '{'또는 '$'"를 기대합니다. – Sven

+0

예제에서는 정수 값을 속성으로 사용하지 않습니다 이름. 안쪽에 숫자가있는 문자열을 사용합니다. 이것이 차이점입니다. 배열 내부에서 키는 항상 정수이며 결코 문자열이 아닙니다. 따라서 숫자 값은 속성 이름으로 사용될 때 매우 문제가됩니다. – Sven