[php] PHP 개체 속성 이름을 어떻게 동적으로 작성합니까?

코드에 다음과 같은 개체 속성이 있습니다.

$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 구성이 있다고 말해야합니다.


답변