Programing

새 속성을 동적으로 만드는 방법

lottogame 2020. 11. 18. 08:21
반응형

새 속성을 동적으로 만드는 방법


객체의 메서드 내에서 주어진 인수로 속성을 어떻게 만들 수 있습니까?

class Foo{

  public function createProperty($var_name, $val){
    // here how can I create a property named "$var_name"
    // that takes $val as value?

  }

}

그리고 다음과 같이 속성에 액세스 할 수 있기를 원합니다.

$object = new Foo();
$object->createProperty('hello', 'Hiiiiiiiiiiiiiiii');

echo $object->hello;

또한 재산을 공개 / 보호 / 사설로 만들 수 있습니까? 이 경우 공개되어야한다는 것을 알고 있지만 보호 된 속성과 물건을 얻기 위해 몇 가지 magik 메서드를 추가하고 싶을 수 있습니다. :)


해결책을 찾은 것 같습니다.

  protected $user_properties = array();

  public function createProperty($var_name, $val){
    $this->user_properties[$var_name] = $val;

  }

  public function __get($name){
    if(isset($this->user_properties[$name])
      return $this->user_properties[$name];

  }

좋은 생각이라고 생각하세요?


두 가지 방법이 있습니다.

첫째, 클래스 외부에서 동적으로 속성을 직접 만들 수 있습니다.

class Foo{

}

$foo = new Foo();
$foo->hello = 'Something';

또는 createProperty방법을 통해 속성을 생성하려는 경우 :

class Foo{
    public function createProperty($name, $value){
        $this->{$name} = $value;
    }
}

$foo = new Foo();
$foo->createProperty('hello', 'something');

속성 과부하는 매우 느립니다. 가능하다면 그것을 피하십시오. 또한 다른 두 가지 매직 메서드를 구현하는 것도 중요합니다.

__isset (); __unset ();

나중에 이러한 개체 "속성"을 사용할 때 몇 가지 일반적인 실수를 찾고 싶지 않은 경우

여기 예시들이 있습니다 :

http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members

Alex 코멘트 이후 편집 :

두 솔루션 간의 시간 차이를 직접 확인할 수 있습니다 ($ REPEAT_PLEASE 변경).

<?php

 $REPEAT_PLEASE=500000;

class a {}

$time = time();

$a = new a();
for($i=0;$i<$REPEAT_PLEASE;$i++)
{
$a->data = 'hi';
$a->data = 'bye'.$a->data;
}

echo '"NORMAL" TIME: '.(time()-$time)."\n";

class b
{
        function __set($name,$value)
        {
                $this->d[$name] = $value;
        }

        function __get($name)
        {
                return $this->d[$name];
        }
}

$time=time();

$a = new b();
for($i=0;$i<$REPEAT_PLEASE;$i++)
{
$a->data = 'hi';
//echo $a->data;
$a->data = 'bye'.$a->data;
}

echo "TIME OVERLOADING: ".(time()-$time)."\n";

다음 구문을 사용하십시오. $ object-> {$ property} 여기서 $ property는 문자열 변수이고 $ object는 이것이 클래스 또는 인스턴스 객체 내에있는 경우이 값이 될 수 있습니다.

라이브 예 : http://sandbox.onlinephpfunctions.com/code/108f0ca2bef5cf4af8225d6a6ff11dfd0741757f

 class Test{
    public function createProperty($propertyName, $propertyValue){
        $this->{$propertyName} = $propertyValue;
    }
}

$test = new Test();
$test->createProperty('property1', '50');
echo $test->property1;

결과 : 50


다음 예제는 전체 클래스를 선언하고 싶지 않은 사람들을위한 것입니다.

$test = (object) [];

$prop = 'hello';

$test->{$prop} = 'Hiiiiiiiiiiiiiiii';

echo $test->hello; // prints Hiiiiiiiiiiiiiiii

참고 URL : https://stackoverflow.com/questions/8707235/how-to-create-new-property-dynamically

반응형