PHP는 속성이 객체 또는 클래스에 존재하는지 확인


159

PHP에는 순수한 객체 변수가 없지만 속성이 주어진 객체 또는 클래스에 있는지 확인하고 싶습니다.

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

또는

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

JS 에서는 변수 a가 객체에 존재 하는지 확인하기 위해 이것을 작성할 수 있습니다 .

if ('a' in ob)

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

조언 해 주셔서 감사합니다.


2
우리가 OOP를 할 때, 우리는 함수가 아니라 메소드라고 말하는 것처럼 변수가 아니라고 말합니다.
Christopher Bonitz

답변:


254

property_exists (혼합 된 $ class, 문자열 $ property)

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

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

if (isset($ob->a))

속성이 null 인 경우 isset ()은 false를 반환합니다

예 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

12
반드시 속성이 존재하지만 정의되지 않은 경우 isset ()은 false를 반환합니다. us3.php.net/manual/en/types.comparisons.php
Mitchell

isset ()을 empty ()와 결합하여 속성 값을 모두 확인할 수 있습니다 .

4
는 isset ()가 잘못된 대답은하지만 당신이 인주의를 알고있는 경우, 상당히 빠른 property_exists ()보다
니코 Westerdale

empty()더 나은 솔루션 이 필요한 상황 입니까? !empty($var)?
b_dubb

1
@b_dubb 아니오, 빈 배열, 0, false, null, ''모두`empty () '에 의해 true를 반환
Peter

61

속성이 존재하고 null인지 확인하려면 function을 사용할 수 있습니다 property_exists().

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

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

bool property_exists (혼합 $ class, 문자열 $ property)

예:

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

7
명시 적 답변에 매우 정확하게 답변하므로 허용되는 답변으로 표시해야합니다. isset은 객체에 속성이 있는지 테스트하는 데 유용하지 않습니다.
Christopher Bonitz

11

isset 또는 property_exists 가 나를 위해 작동 하지 않습니다 .

  • 속성이 존재하지만 NULL 인 경우 isset 은 false를 반환합니다.
  • property_exists 는 속성이 설정되지 않은 경우에도 속성이 객체의 클래스 정의에 포함되어 있으면 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
        }
    }

property_exist + 설정되지 않은 속성으로 인해 버그가 발생할 수 있습니다. 이것은 가장 안전한 방법 인 것 같습니다
Thanh Trung

array_key_exists ()는 PHP 7.4에서 더 이상 사용되지 않습니다
Ali_Hr

"객체에서 array_key_exists () 사용은 더 이상 사용되지 않습니다"의 키워드는 객체입니다. get_object_vars ()는 배열을 반환하므로 여전히 좋습니다.
smariot

7

해결책

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';
}

이것들은 긴 형식의 진술에서는 괜찮지 만 삼항 진술에서는 불필요하게 번거 롭습니다.

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

다음과 같이 삼항 연산자를 사용하여이를 달성 할 수도 있습니다.

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

그러나 ... 값이 존재하지 않으면 (설정되지 않은 경우) 값이 높아지고 E_NOTICE실용적이지 않습니다. 값이 있으면 null예외가 발생하지 않습니다.

따라서 구조에 대한 삼항 연산자는 이것을 깔끔한 작은 대답으로 만듭니다.

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


좋은 설명!
DasBen

4

정의한 클래스 의 인스턴스 에 속성이 있는지 확인 하려면와 결합 property_exists()하면 isset()됩니다.

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

1
property_exists($this, $property)코드는 항상 isset($this->$property)단독으로 결과가 같으므로 호출 은 일종의 중복 입니다.
MarthyM

isset()속성이 클래스 정의의 진정한 구성원인지 여부를 알 수 없기 때문에 이것은 사실에 대한보다 완전한 검사입니다 . 나중에 다시 찾아 보도록하겠습니다.
Anthony Rutledge 2

사실, 출력은 실제 클래스 속성과 동일합니다. __get()더 중요한 __isset()마술 방법 을 가진 가상 속성 이있는 경우 출력이 경우에 따라 다릅니다.
MarthyM

1

무언가가 빠져 있는지 확인하려면 PHP 함수 isset ()을 참조하십시오 . php.net . 이 함수는 변수가 설정되어 있고 NULL이 아닌지 확인합니다.

예:

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

속성이 클래스에 존재하는지 확인 해야하는 경우 property_exists () 함수에서 빌드를 사용할 수 있습니다

예:

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

1

객체에서 array_key_exists () 사용은 PHP 7.4에서 더 이상 사용되지 않습니다.

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

참조 : php.net


0

여기 내 센트를두기 만하면됩니다.

다음과 같은 클래스가 주어집니다.

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

이것이 누군가를 도울 수 있기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.