Property_exists()は、プロパティの値がnullであるかどうかに関係なく、オブジェクトが特定のプロパティを持っているかどうかを検出するために使用され、存在する限り(割り当てられているかどうかにかかわらず)。
文法:
property_exists(object|string $object_or_class, string $property): bool
例:
class User {
public $name;
private $email;
}
$user = new User();
var_dump(property_exists($user, 'name')); // true
var_dump(property_exists($user, 'email')); // true
var_dump(property_exists($user, 'age')); // false
上記の例からわかるように、 Property_Exists()は私有財産を検出できます。プロパティがクラスに存在する限り、その可視性とそれが割り当てられているかどうかに関係なく、それは真実に戻ります。
アドバンテージ:
すべての可視性(公共、保護、プライベート)プロパティを検出できます。
属性が割り当てられているかどうかは気にしません。たとえそれがnullであっても、存在すると判断できます。
欠点:
属性が初期化されたかどうかを判断することは不可能であり、宣言されているかどうかを判断することのみができます。
ISSET()は、変数がnullではなく割り当てられているかどうかを判断する際により一般的です。また、オブジェクトプロパティの検出にも使用できます。
文法:
isset(mixed $var): bool
例:
class User {
public $name;
public $email = null;
}
$user = new User();
var_dump(isset($user->name)); // false
var_dump(isset($user->email)); // false
$user->name = 'Tom';
var_dump(isset($user->name)); // true
アドバンテージ:
属性がnullではなく割り当てられているかどうかを判断できます。
データの可用性を確認するために、いくつかの論理的判断でより一般的に使用されています。
欠点:
プライベートまたは保護されたプロパティを検出できません(クラスの外部でアクセスした場合)。
属性が存在するがnullの場合、結果は依然として偽で、誤判断を引き起こす可能性があります。
比較する | property_exists() | Isset() |
---|---|---|
属性が存在するかどうか | ?はい | ??属性が割り当てられていない、またはnullの場合は、falseを返します |
属性nullです | ?影響を受けていません | ? falseが返されます |
プライベート/保護属性検出 | ?できる | ?クラスの外にアクセスできません |
データ判断に使用されます | ?お勧めしません | ?一般的に使用されます |
反射のために、デバッグ | ?より正確です | ?十分に厳格ではありません |
シナリオ1:クラスで特定の属性が宣言されているかどうかを判断します
Property_exists()の使用はより信頼性が高くなります:
if (property_exists($user, 'name')) {
echo "属性が存在します";
}
シナリオ2:特定の属性が割り当てられているかどうかを判断します
Isset()を使用する方が適切です。
if (isset($user->name)) {
echo "属性は割り当てられていません null";
}
シナリオ3:APIを介してJSONマッピングオブジェクトプロパティを検出します
JSONデータマッピングをPHPオブジェクトに処理する場合、プロパティはnullになる場合があります。
$json = '{"title": null}';
$data = json_decode($json);
var_dump(property_exists($data, 'title')); // true
var_dump(isset($data->title)); // false
この例は、 Property_Exists()が宣言を検出し、 ISSET()が割り当てステータスを検出する一方で、宣言を検出することを明確に示しています。
ほとんどの場合、2つのパフォーマンスの差は大きくありませんが、 ISSET()は言語構造であり、 Property_Exists() (機能)よりもわずかに高速です。ただし、精度を考慮すると、判断力とオブジェクト構造を入力することに関して、より明示的なセマンティクスを持つ関数を選択することをお勧めします。
パフォーマンス要件が非常に高く、構造が信頼できると保証されている場合、 ISSET()を迅速に検出するために使用できます。ただし、プロパティ宣言を厳密に検出する必要がある場合は、 Property_Exists()を使用する必要があります。
実際の開発では、Restful APIクライアントを構築している場合、JSON応答に特定のフィールドが含まれているかどうかを判断する必要があります。フィールド値がnullであっても、 Property_exists()を使用して互換性を確保する必要があります。たとえば、エラーメッセージフィールドがあるかどうかを判断するには:
if (property_exists($response, 'error')) {
// エラーメッセージを処理します
}
空でない文字列や有効な数字など、フィールドにとって理にかなっているデータのみに焦点を当てる場合は、 ISSET()を使用できます。
if (isset($response->data->url)) {
$url = $response->data->url;
header("Location: https://gitbox.net/redirect?url=" . urlencode($url));
}