PHP nesnenin ya da sınıfın özelliği olup olmadığını kontrol edin


159

PHP saf bir nesne değişkeni olmadığını anlıyorum, ama bir özellik verilen nesne veya sınıfta olup olmadığını kontrol etmek istiyorum.

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

veya

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

In JS, ben değişken olmadığını kontrol etmek için bu yazabilirsiniz abir nesne var:

if ('a' in ob)

In PHP, böyle bir şey yapılabilir?

Tavsiyen için teşekkür ederim.


2
Sadece bahsettiğimizde ... OOP yaptığımızda, özellik değil, yöntem dediğimiz gibi, işlev değil değişken diyoruz.
— Christopher Bonitz

Yanıtlar:


254

property_exists (karışık $ class, string $ property)

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

isset (karışık $ var [, karışık $ ...])

if (isset($ob->a))

özellik null olursa isset () yanlış döndürür

Örnek 1:

$ob->a = null
var_dump(isset($ob->a)); // false

Örnek 2:

class Foo
{
   public $bar = null;
}

$foo = new Foo();

var_dump(property_exists($foo, 'bar')); // true
var_dump(isset($foo->bar)); // false

12
Özellik yoksa, ancak tanımlanmadıysa isset () öğesi false değerini döndürür. us3.php.net/manual/tr/types.comparisons.php
— Mitchell

isset () özelliği ve değeri kontrol etmek için empty () ile birleştirilebilir .

4
İsset () yanlış cevap olsa da, uyarının farkındaysanız property_exists () 'den oldukça hızlıdır
— Nico Westerdale

bu empty()daha iyi bir çözümün olduğu bir durum mu? !empty($var)?
— b_dubb

1
@b_dubb no, boş dizi, 0, yanlış, null, '' hepsi boş () ile döner
— Peter

61

Özelliğin var olup olmadığını ve null değerinin olup olmadığını kontrol etmek için işlevi kullanabilirsiniz property_exists().

Dokümanlar: http://php.net/manual/en/function.property-exists.php

İsset () işlevinin aksine, özellik NULL değerine sahip olsa bile property_exists (), TRUE değerini döndürür.

bool property_exists (karışık $ sınıfı, string $ özelliği)

Misal:

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

7
Açık cevabı çok kesin olarak cevapladığı için bu kabul edilmiş cevap olarak işaretlenmelidir. isset, bir nesnede bir özelliğin varlığını test etmek için yararlı değildir.
— Christopher Bonitz

11

Ne isset veya property_exists benim için çalışıyor.

  • özellik varsa ancak NULL ise isset false değerini döndürür.
  • property_exists , nesne ayarlanmamış olsa bile nesnenin sınıf tanımının bir parçasıysa true değerini döndürür.

Ben sona erdi:

    $exists = array_key_exists($property, get_object_vars($obj));

Misal:

    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 + unset özelliği, buggy davranışına neden olabilir. Bu en güvenli yöntem gibi görünüyor
— Thanh Trung

array_key_exists () php 7.4'te kullanımdan
— kaldırıldı

"Nesnelerde array_key_exists () yönteminin kullanımı reddedildi" anahtar kelimesi nesnelerdir. get_object_vars () bir dizi döndürür, bu yüzden hala iyiyiz.
— smariot

7

Çözüm

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

Bunun nasıl çalıştığına dair daha fazla netlik için bunun bir if ifadesinde nasıl görüneceğini göstermek.

if($person->middleName ?? false) {
    echo $person->middleName;
} else {
    echo 'Person does not have a middle name';
}

açıklama

Bir şeyin varlığını kontrol etmenin geleneksel PHP yolu:

if(isset($person->middleName)) {
    echo $person->middleName;
} else {
    echo 'Person does not have a middle name';
}

VEYA daha sınıfa özgü bir yol için:

if(property_exists($person, 'middleName')) {
    echo $person->middleName;
} else {
    echo 'Person does not have a middle name';
}

Bunların her ikisi de uzun biçimli ifadelerde iyidir, ancak üçlü ifadelerde gereksiz şekilde hantal hale gelirler:

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

Bunu sadece aşağıdaki üçlü operatörle de yapabilirsiniz:

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

Ama ... eğer değer yoksa (ayarlanmadıysa) bir artıracak E_NOTICEve en iyi uygulama değildir. Değer, nullistisnayı artırmaz.

Bu nedenle kurtarma için üçlü operatör bunu düzgün küçük bir cevap haline getirir:

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


Harika bir açıklama!
— DasBen

4

Eğer bir özelliği bir var olup olmadığını bilmek istiyorsanız Örneğin tanımladığınız bir sınıfın, sadece birleştirmek property_exists()ile isset().

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

1
Kodlama property_exists($this, $property)her zaman isset($this->$property)tek başına aynı sonuca sahip olacağından, arama burada gereksizdir .
— MarthyM

Bu, gerçeklerin daha eksiksiz bir incelemesidir, çünkü isset()bir mülkün sınıf tanımının gerçek bir üyesi olup olmadığını söyleyemezsiniz. Emin olmak için daha sonra tekrar arayacağım.
— Anthony Rutledge

Bu, çıktı gerçek sınıf özellikleri için aynı olacaktır. Sanal özellikleriniz __get()ve daha da önemlisi __isset()sihirli yöntemleriniz varsa, çıktı bazı durumlarda farklı olacaktır.
— MarthyM

1

Bir şeylerin çıkıp çıkmadığını kontrol etmek için php.net adresine bakın . Bu işlev, değişkenin ayarlanıp ayarlanmadığını ve NULL olmadığını kontrol eder.

Misal:

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

Sınıfta bir özelliğin olup olmadığını kontrol etmeniz gerekiyorsa, build__ists () işlevindeki build işlevini kullanabilirsiniz.

Misal:

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

1

Nesnelerde array_key_exists () kullanımı php 7.4'te kaldırılmıştır

Bunun yerine isset () veya property_exists () kullanılmalıdır

başvuru: php.net


0

Sadece 2 sentimi buraya koyuyorum.

Aşağıdaki sınıf verildiğinde:

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

aşağıdakiler olacak:

$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

Umarım bu herkese yardımcı olur

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.