새 속성을 동적으로 만드는 방법
객체의 메서드 내에서 주어진 인수로 속성을 어떻게 만들 수 있습니까?
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
'Programing' 카테고리의 다른 글
"#! / usr / bin / env python"을 사용하여 python에 인수를 전달할 수 없습니다. (0) | 2020.11.18 |
---|---|
Spring Batch에서 ItemReader에서 작업 매개 변수에 액세스하는 방법은 무엇입니까? (0) | 2020.11.18 |
Haskell 운영자에게 허용되는 문자는 무엇입니까? (0) | 2020.11.18 |
C 및 C ++ : 자동 구조의 부분 초기화 (0) | 2020.11.18 |
Java에서 ArrayList 요소의 값을 변경하는 방법 (0) | 2020.11.18 |