簡體   English   中英

PHP 檢查 object 或 class 中是否存在屬性

[英]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 中,可以這樣做嗎?

property_exists( 混合 $class , string $property )

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

isset( 混合 $var [, 混合 $... ] )

注意:請注意,如果屬性為 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
}

issetproperty_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
        }
    }

解決方案

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
}

在對象上使用 array_key_exists() 在 php 7.4 中已棄用

相反,應該使用 isset() 或 property_exists()

參考: php.net

把我的 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中,可以執行類似的操作嗎?

非常感謝您的建議。

這是相當新的,所以請確保您正在運行 PHP 8:

$ob?->a

參考鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM