Program Club

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

proclub 2020. 12. 2. 22:08
반응형

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찾아 올바른 값을 반환합니다.


aboulfazl, 클래스와 이름이 같은 PHP 5.3.3 메서드는 생성자로 처리되지 않기 때문입니다!

    YourClass
    {
        public $any = false;

        public function __construct($any = null)
        {
            $this->any = (is_null($any) ? $this->any : $any);
        }
    }

이것은 작동하지만 주제 소유자가 묻지 않았습니다. Jon이 awnser를 제공합니다!


동적으로 생성 된 개체 속성을 사용하는 일부 코드를 작업했습니다. 동적으로 생성 된 객체 속성을 사용하는 것이 꽤 멋지다고 생각했습니다 (제 생각에는 사실입니다). 그러나 내 프로그램을 실행하는 데 7 초가 걸렸습니다. 동적 개체 속성을 제거하고 각 클래스의 일부로 선언 된 개체 속성 (이 경우 public)을 대체했습니다. CPU 시간은 7 초에서 0.177 초로 증가했습니다. 꽤 상당합니다.

동적 개체 속성을 사용하는 방식에서 내가 뭔가 잘못하고 있었을 가능성이 있습니다. 내 구성이 어떤 식 으로든 손상되었을 수도 있습니다. 물론, 내 컴퓨터에 매우 평범한 바닐라 PHP 구성이 있다고 말해야합니다.


The best way you can use instance of PHP default class Object to dynamically assign properties to it

$inst=new \StdClass;
$inst->any_property = '';

With Inheritance. for Example:

YourClass extends stdClass {
   public function YourClass() {
      $this->AnyProperty="any";
   }
}

Now AnyProperty is Dynamically Declared.

참고URL : https://stackoverflow.com/questions/12571197/how-do-i-dynamically-write-a-php-object-property-name

반응형