코드에 다음과 같은 개체 속성이 있습니다.
$obj ->field_name_cars[0];
$obj ->field_name_clothes[0];
문제는 100 개의 필드 이름이 있고 속성 이름을 동적으로 작성해야한다는 것입니다. 그렇지 않으면 속성의 개체 이름과 키가 항상 동일합니다. 그래서 나는 시도했다.
$obj -> $field[0];
속성의 이름이 동적으로 변경되고 올바른 값에 액세스하기를 바랍니다. 그러나 나는 계속 ‘정의되지 않은 속성 $ field in stdClass :: $ field;
다소간 적절한 값을 출력 할 수 있도록 PHP가 실행되기 전에 동적으로 작성하려고합니다. 이것에 접근하는 방법에 대한 생각?
답변
PHP 7.0 업데이트
PHP 7에서는 파서 수준에서 간접 변수 및 속성을 처리하는 방법에 대한 변경 사항을 도입했습니다 (자세한 내용은 해당 RFC 참조). 이렇게하면 실제 동작이 예상에 더 가까워지고이 경우 $obj->$field[0]
예상 결과가 생성됩니다.
(이제 개선 된) 기본 동작이 바람직하지 않은 경우에도 아래와 같이 중괄호를 사용하여 재정의 할 수 있습니다.
원래 답변
다음과 같이 액세스를 작성하십시오.
$obj->{$field}[0]
이 “중괄호로 묶기”트릭은 변수 변수로 인해 모호한 부분이있을 때마다 PHP에서 유용합니다.
초기 코드를 고려하십시오. $obj->$field[0]
“”에 이름이 지정된 속성에 액세스 $field[0]
“또는” “에 0
이름이있는 속성의 키로 요소에 액세스 $field
“를 의미합니까? 중괄호를 사용하면 명시 적으로 표현할 수 있습니다.
답변
다른 배열 / 객체에서 값에 액세스 할 때 다음과 같은 중괄호 구문을 사용하여 가장 잘 달성되는 가변 변수 유형 표기법을 찾고 있다고 생각합니다.
$obj->{field[0]}
답변
마법의 방법 __get은 당신의 친구입니다.
class MyClass
{
private $field = array();
public function __get($name)
{
if(isset($this->field[$name]))
return $this->field[$name];
else
throw new Exception("$name dow not exists");
}
}
용법:
$myobj = new MyClass();
echo $myobj->myprop;
설명 : 모든 필드 데이터는 배열에 저장됩니다. 액세스 할 때$myobj->myprop
해당 속성에 하면 분명히 클래스에 존재하지 않습니다. 그것이 __get
호출 되는 곳 입니다. 배열 __get
에서 이름을 field
찾아 올바른 값을 반환합니다.
답변
오늘 저는 그 도전에 직면합니다. 그 개발 스타일로 끝났어
$countTickets = new \stdClass;
foreach ($tickets as $key => $value) {
if(!isset($countTickets->total)){
$countTickets->total = 0;
}
if(!isset($countTickets->{$value['categoryname']})){
$countTickets->{$value['categoryname']} = 0;
}
$countTickets->total += $value['number'];
$countTickets->{$value['categoryname']} += $value['number'];
}
답변
동적으로 생성 된 개체 속성을 사용하는 일부 코드를 작업했습니다. 동적으로 생성 된 객체 속성을 사용하는 것이 꽤 멋지다고 생각했습니다 (제 생각에는 사실입니다). 그러나 내 프로그램을 실행하는 데 7 초가 걸렸습니다. 동적 개체 속성을 제거하고 각 클래스의 일부로 선언 된 개체 속성 (이 경우 public)을 대체했습니다. CPU 시간은 7 초에서 0.177 초로 증가했습니다. 꽤 상당합니다.
동적 개체 속성을 사용하는 방식에 문제가있을 수 있습니다. 내 구성이 어떤 식 으로든 손상되었을 수도 있습니다. 물론, 내 컴퓨터에 매우 평범한 바닐라 PHP 구성이 있다고 말해야합니다.