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
}
Isset도 property_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
'programing' 카테고리의 다른 글
| python re.sub 그룹: \number 뒤의 숫자 (0) | 2022.09.21 |
|---|---|
| nodejsmysql 오류: Connection lost 서버가 연결을 닫았습니다. (0) | 2022.09.20 |
| 가입 시 특정 사용자에 대한 문서를 표시하는 SQL 조회 (0) | 2022.09.20 |
| 자바에서 스크린샷을 찍어서 이미지 같은 것에 저장하는 방법이 있나요? (0) | 2022.09.20 |
| 셸 명령어 실행 및 출력 캡처 (0) | 2022.09.20 |