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.