development

문자열로 PHP 클래스 속성 가져 오기

big-blog 2020. 7. 2. 07:16
반응형

문자열로 PHP 클래스 속성 가져 오기


문자열을 기반으로 PHP에서 속성을 얻는 방법은 무엇입니까? 전화하겠습니다 magic. 그래서 무엇 magic입니까?

$obj->Name = 'something';
$get = $obj->Name;

마치 ...

magic($obj, 'Name', 'something');
$get = magic($obj, 'Name');

이렇게

<?php

$prop = 'Name';

echo $obj->$prop;

또는 클래스를 제어 할 수있는 경우 ArrayAccess 인터페이스를 구현 하고이 작업을 수행하십시오.

echo $obj['Name'];

중간 변수를 만들지 않고 속성에 액세스하려면 다음 {}표기법을 사용하십시오 .

$something = $object->{'something'};

또한 예를 들어 루프에서 속성 이름을 만들 수 있습니다.

for ($i = 0; $i < 5; $i++) {
    $something = $object->{'something' . $i};
    // ...
}

당신이 요구하는 것은 Variable Variables 입니다. 문자열에 변수를 저장하고 다음과 같이 액세스하면됩니다.

$Class = 'MyCustomClass';
$Property = 'Name';
$List = array('Name');

$Object = new $Class();

// All of these will echo the same property
echo $Object->$Property;  // Evaluates to $Object->Name
echo $Object->{$List[0]}; // Use if your variable is in an array

이 같은? 테스트하지는 않았지만 정상적으로 작동합니다.

function magic($obj, $var, $value = NULL)
{
    if($value == NULL)
    {
        return $obj->$var;
    }
    else
    {
        $obj->$var = $value;
    }
}

속성 이름을 변수에 저장하고 변수를 사용하여 속성에 액세스하십시오. 이처럼 :

$name = 'Name';

$obj->$name = 'something';
$get = $obj->$name;

$ obj-> {$ obj-> Name}은 중괄호가 변수를 변수처럼 속성을 감싸는 것이 간단합니다.

이것은 최고 검색이었습니다. 그러나 $ this를 사용하는 내 질문을 해결하지 못했습니다. 중괄호를 사용하는 환경의 경우에도 도움이되었습니다 ...

Code Igniter를 사용한 예제 인스턴스 가져 오기

부모 클래스 인스턴스가있는 소스 라이브러리 클래스에서

$this->someClass='something';
$this->someID=34;

부모 인스턴스와 함께 다른 클래스에서 소스 해야하는 라이브러리 클래스

echo $this->CI->{$this->someClass}->{$this->someID};

이 질문에 대한 답이있을 수 있지만 PHP 7 로의 마이그레이션을보고 싶을 것입니다

backward incompatible change

출처 : php.net


추가로 : 이렇게하면 다른 방법으로는 사용할 수없는 이름으로 속성에 액세스 할 수 있습니다

$ x = 새로운 StdClass;

$ prop = 'ab'; $ x-> $ prop = 1; $ x-> { 'x y'} = 2; var_dump ($ x);

object (stdClass) # 1 (2) {
  [ "a b"] =>
  int (1)
  [ "x y"] =>
  int (2)
}
(필요하지는 않지만 필요한 경우).
더 멋진 물건을 만들고 싶다면 반성을 들여다 봐야 합니다.


다른 사람이 알려지지 않은 깊이의 깊은 속성을 찾으려면 모든 어린이의 모든 알려진 속성을 반복하지 않고도 아래를 생각해 냈습니다.

예를 들어 $ Foo-> Bar-> baz 또는 $ Foo-> baz 또는 $ Foo-> Bar-> Baz-> dave를 찾으려면 여기서 $ path는 'foo / bar / baz'와 같은 문자열입니다.

public function callModule($pathString, $delimiter = '/'){

    //split the string into an array
    $pathArray = explode($delimiter, $pathString);

    //get the first and last of the array
    $module = array_shift($pathArray);
    $property = array_pop($pathArray);

    //if the array is now empty, we can access simply without a loop
    if(count($pathArray) == 0){
        return $this->{$module}->{$property};
    }

    //we need to go deeper
    //$tmp = $this->Foo
    $tmp = $this->{$module};

    foreach($pathArray as $deeper){
        //re-assign $tmp to be the next level of the object
        // $tmp = $Foo->Bar --- then $tmp = $Bar->baz
        $tmp = $tmp->{$deeper};
    }

    //now we are at the level we need to be and can access the property
    return $tmp->{$property};

}

그런 다음 다음과 같이 호출하십시오.

$propertyString = getXMLAttribute('string'); // '@Foo/Bar/baz'
$propertyString = substr($propertyString, 1);
$moduleCaller = new ModuleCaller();
echo $moduleCaller->callModule($propertyString);

여기 내 시도가 있습니다. 일반적인 '어리 석음'검사가 내장되어 있으므로 사용할 수없는 멤버를 설정하거나 얻지 마십시오.

이러한 'property_exists'검사를 각각 __set 및 __get으로 이동하고 magic () 내에서 직접 호출 할 수 있습니다.

<?php

class Foo {
    public $Name;

    public function magic($member, $value = NULL) {
        if ($value != NULL) {
            if (!property_exists($this, $member)) {
                trigger_error('Undefined property via magic(): ' .
                    $member, E_USER_ERROR);
                return NULL;
            }
            $this->$member = $value;
        } else {
            if (!property_exists($this, $member)) {
                trigger_error('Undefined property via magic(): ' .
                    $member, E_USER_ERROR);
                return NULL;
            }
            return $this->$member;
        }
    }
};

$f = new Foo();

$f->magic("Name", "Something");
echo $f->magic("Name") , "\n";

// error
$f->magic("Fame", "Something");
echo $f->magic("Fame") , "\n";

?>

What this function does is it checks if the property exist on this class of any of his child's, and if so it gets the value otherwise it returns null. So now the properties are optional and dynamic.

/**
 * check if property is defined on this class or any of it's childes and return it
 *
 * @param $property
 *
 * @return bool
 */
private function getIfExist($property)
{
    $value = null;
    $propertiesArray = get_object_vars($this);

    if(array_has($propertiesArray, $property)){
        $value = $propertiesArray[$property];
    }

    return $value;
}

Usage:

const CONFIG_FILE_PATH_PROPERTY = 'configFilePath';

$configFilePath = $this->getIfExist(self::CONFIG_FILE_PATH_PROPERTY);

$classname = "myclass";
$obj = new $classname($params);

$variable_name = "my_member_variable";
$val = $obj->$variable_name; //do care about the level(private,public,protected)

$func_name = "myFunction";
$val = $obj->$func_name($parameters);

why edit: before : using eval (evil) after : no eval at all. being old in this language.

참고URL : https://stackoverflow.com/questions/804850/get-php-class-property-by-string

반응형