programing

PHP는 속성이 개체 또는 클래스에 있는지 확인합니다.

sourcejob 2022. 9. 20. 23:56
반응형

PHP는 속성이 개체 또는 클래스에 있는지 확인합니다.

PHP에 순수한 오브젝트 변수가 없는 것은 알지만 속성이 지정된 오브젝트나 클래스에 있는지 확인하고 싶습니다.

$ob = (object) array('a' => 1, 'b' => 12); 

또는

$ob = new stdClass;
$ob->a = 1;
$ob->b = 2;

JS에서는 변수를 확인하기 위해 이것을 쓸 수 있다.a오브젝트 내에 존재합니다.

if ('a' in ob)

PHP에서는 이와 같은 작업을 수행할 수 있습니까?

property_class(혼합 $class, 문자열 $class)

if (property_exists($ob, 'a')) 

isset ( mixed $var [, mixed $...])

메모: 속성이 null일 경우 isset()이 false를 반환한다는 점에 유의하십시오.

if (isset($ob->a))

예 1:

$ob->a = null
var_dump(isset($ob->a)); // false

예 2:

class Foo
{
   public $bar = null;
}

$foo = new Foo();

var_dump(property_exists($foo, 'bar')); // true
var_dump(isset($foo->bar)); // false

속성이 존재하는지, null인지 확인하려면 함수를 사용할 수 있습니다.property_exists().

문서: http://php.net/manual/en/function.property-exists.php

isset()과 달리 property_exists()는 속성의 값이 NULL인 경우에도 TRUE를 반환합니다.

bool property_module (혼합 $class, 문자열 $module)

예:

if (property_exists($testObject, $property)) {
    //do something
}

Issetproperty_exist도 나에게는 통하지 않는다.

  • 속성이 존재하지만 NULL인 경우 isset은 false를 반환합니다.
  • property_module은 속성이 오브젝트 클래스 정의의 일부인 경우(설정 해제된 경우에도) true를 반환합니다.

나는 결국 다음과 같이 되었다.

    $exists = array_key_exists($property, get_object_vars($obj));

예:

    class Foo {
        public $bar;

        function __construct() {
            $property = 'bar';

            isset($this->$property); // FALSE
            property_exists($this, $property); // TRUE
            array_key_exists($property, get_object_vars($this)); // TRUE

            unset($this->$property);

            isset($this->$property); // FALSE
            property_exists($this, $property); // TRUE
            array_key_exists($property, get_object_vars($this)); // FALSE

            $this->$property = 'baz';

            isset($this->$property); // TRUE
            property_exists($this, $property); // TRUE
            array_key_exists($property, get_object_vars($this));  // TRUE
        }
    }

솔루션

echo $person->middleName ?? 'Person does not have a middle name';

if 스테이트먼트에서 이것이 어떻게 보이는지 보여줌으로써 이 동작의 구조를 보다 명확하게 한다.

if($person->middleName ?? false) {
    echo $person->middleName;
} else {
    echo 'Person does not have a middle name';
}

설명.

기존 PHP의 존재 확인 방법은 다음과 같습니다.

if(isset($person->middleName)) {
    echo $person->middleName;
} else {
    echo 'Person does not have a middle name';
}

또는 보다 클래스 고유의 방법:

if(property_exists($person, 'middleName')) {
    echo $person->middleName;
} else {
    echo 'Person does not have a middle name';
}

긴 형식의 문장은 둘 다 좋지만, 3진법의 문장은 다음과 같이 불필요하게 번거로워집니다.

isset($person->middleName) ? echo $person->middleName : echo 'Person does not have a middle name';

다음과 같이 3진 연산자만으로 이를 달성할 수도 있습니다.

echo $person->middleName ?: 'Person does not have a middle name';

단, 값이 존재하지 않는 경우(설정되지 않은 경우)는,E_NOTICE베스트 프랙티스가 아닙니다.값이 다음과 같은 경우null예외는 발생하지 않습니다.

따라서 구조 작업자는 다음과 같은 간단한 답변을 제공합니다.

echo $person->middleName ?? 'Person does not have a middle name';

정의한 클래스의 인스턴스에 속성이 존재하는지 여부를 확인하려면 를 조합하기만 하면 됩니다.property_exists()와 함께isset().

public function hasProperty($property)
{
    return property_exists($this, $property) && isset($this->$property);
}

저는 보통 커스텀 도우미를 사용합니다.

    /**
     * @param Object $object
     * @param string $property as a string with nested properties 'prop1.nesterdProp.deepvalue'
     * @param mixed $default
     * @return mixed
     */
    function getPropertyOrDefault(Object $object, string $property, $default = null)
    {
        $value = $object;
        $path = explode('.', $property);
        foreach ($path as $prop) {
            if (is_object($value) && property_exists($value, $prop)) {
                $value = $value->{$prop};
            } else {
                return $default;
            }
        }
        return $value;
    }

속성이 비어 있으면 빈 값이 표시되고 기본값은 표시되지 않습니다.

그런데 JS에서도 같은 도우미가 작동합니다.

종료 여부를 확인하려면 , PHP 함수 isset() 를 사용합니다.php.net 를 참조해 주세요.이 함수는 변수가 설정되어 있고 NULL이 아닌지 확인합니다.

예:

if(isset($obj->a))
{ 
  //do something
}

클래스에 속성이 있는지 확인해야 할 경우 build in 함수 property_exists()를 사용할 수 있습니다.

예:

if (property_exists('class', $property)) {
    //do something
}

개체에서 array_key_exists()를 사용하는 것은 php 7.4에서는 권장되지 않습니다.

대신 isset() 또는 property_exists() 중 하나를 사용해야 합니다.

레퍼런스 : php.net

이것은 매우 새로운 것이므로, PHP 8을 실행하고 있는지 확인해 주세요.

$ob?->a

참조 링크

내 2센트를 여기에 넣기만 하면 돼.

다음 클래스가 지정됩니다.

class Foo
{
  private $data;

  public function __construct(array $data)
  {
    $this->data = $data;
  }

  public function __get($name)
  {
    return $data[$name];
  }

  public function __isset($name)
  {
    return array_key_exists($name, $this->data);
  }
}

다음과 같이 됩니다.

$foo = new Foo(['key' => 'value', 'bar' => null]);

var_dump(property_exists($foo, 'key'));  // false
var_dump(isset($foo->key));  // true
var_dump(property_exists($foo, 'bar'));  // false
var_dump(isset($foo->bar));  // true, although $data['bar'] == null

이것이 누구에게나 도움이 되기를 바란다.

언급URL : https://stackoverflow.com/questions/14414379/php-check-whether-property-exists-in-object-or-class

반응형