[英]PHP check whether property exists in object or class
我了解 PHP 沒有純 object 變量,但我想檢查一個屬性是否在給定的 object 或 ZA2F2ED4F8EBC2ABCBDDC 中。
$ob = (object) array('a' => 1, 'b' => 12);
或者
$ob = new stdClass;
$ob->a = 1;
$ob->b = 2;
在JS 中,我可以寫這個來檢查變量a
是否存在於 object 中:
if ('a' in ob)
在PHP 中,可以這樣做嗎?
if (property_exists($ob, 'a'))
注意:請注意,如果屬性為 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
要檢查屬性是否存在以及它是否也為空,您可以使用函數property_exists()
。
文檔:http: //php.net/manual/en/function.property-exists.php
與 isset() 不同,property_exists() 會返回 TRUE,即使該屬性的值為 NULL。
bool property_exists ( 混合 $class , string $property )
例子:
if (property_exists($testObject, $property)) {
//do something
}
isset或property_exists都不適合我。
我最終選擇了:
$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';
}
這些在長格式語句中都很好,但在三元語句中它們變得不必要的麻煩,如下所示:
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';
如果您想知道某個屬性是否存在於您定義的類的實例中,只需將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
}
如果您需要檢查一個屬性是否存在於一個類中,那么您可以使用內置函數property_exists()
例子:
if (property_exists('class', $property)) {
//do something
}
把我的 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
希望這會幫助任何人
我了解PHP沒有純對象變量,但是我想檢查屬性是否在給定的對象或類中。
$ob = (object) array('a' => 1, 'b' => 12);
或者
$ob = new stdClass;
$ob->a = 1;
$ob->b = 2;
在JS中,我可以編寫以下代碼來檢查對象中是否存在變量a
:
if ('a' in ob)
在PHP中,可以執行類似的操作嗎?
非常感謝您的建議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.