PHP memeriksa apakah properti ada di objek atau kelas


159

Saya mengerti PHP tidak memiliki variabel objek murni, tetapi saya ingin memeriksa apakah properti ada di objek atau kelas yang diberikan.

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

atau

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

Di JS, saya bisa menulis ini untuk memeriksa apakah variabel aada di objek:

if ('a' in ob)

Dalam PHP, dapatkah hal seperti ini dilakukan?

Terima kasih banyak atas sarannya.


2
Hanya menyebutkan ... ketika kita melakukan OOP, kita mengatakan properti bukan variabel, seperti kita katakan metode, bukan fungsi.
Christopher Bonitz

Jawaban:


254

property_exists (campuran $ class, string $ property)

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

isset (campuran $ var [, campuran $ ...])

if (isset($ob->a))

isset () akan mengembalikan false jika properti adalah nol

Contoh 1:

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

Contoh 2:

class Foo
{
   public $bar = null;
}

$foo = new Foo();

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

12
Tidak harus, jika properti itu ada, tetapi tidak didefinisikan isset () akan mengembalikan false. us3.php.net/manual/en/types.comparisons.php
Mitchell

isset () dapat dikombinasikan dengan kosong () untuk memeriksa properti dan nilai.

4
Meskipun isset () adalah jawaban yang salah, jika Anda mengetahui peringatan itu jauh lebih cepat daripada property_exists ()
Nico Westerdale

apakah ini situasi di mana empty()solusi yang lebih baik? !empty($var)?
b_dubb

1
@b_dubb tidak, array kosong, 0, false, null, '' semuanya kembali benar dengan `empty () '
Peter

61

Untuk memeriksa apakah properti itu ada dan juga nol, Anda dapat menggunakan fungsinya property_exists().

Documents: http://php.net/manual/en/function.property-exists.php

Berbeda dengan isset (), property_exists () mengembalikan TRUE bahkan jika properti memiliki nilai NULL.

bool property_exists (campuran $ class, string $ property)

Contoh:

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

7
Ini harus ditandai sebagai jawaban yang diterima karena menjawab jawaban eksplisit dengan sangat tepat. isset tidak berguna untuk menguji keberadaan properti dalam suatu objek.
Christopher Bonitz

11

Baik isset atau property_exists bekerja untuk saya.

  • isset mengembalikan false jika properti itu ada tetapi NULL.
  • property_exists mengembalikan true jika properti adalah bagian dari definisi kelas objek, bahkan jika itu tidak disetel.

Saya akhirnya pergi dengan:

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

Contoh:

    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 + properti tidak disetel mungkin menyebabkan perilaku buggy. Ini tampaknya menjadi metode teraman
Thanh Trung

array_key_exists () tidak digunakan lagi dalam php 7.4
Ali_Hr

Kata kunci dalam "Menggunakan array_key_exists () pada objek sudah usang" adalah objek. get_object_vars () mengembalikan array, jadi kami masih bagus.
smariot

7

Larutan

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

Untuk menunjukkan bagaimana ini akan terlihat dalam pernyataan if untuk kejelasan lebih lanjut tentang bagaimana ini bekerja.

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

Penjelasan

Cara PHP tradisional untuk memeriksa keberadaan sesuatu adalah dengan melakukan:

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

ATAU untuk cara yang lebih spesifik kelas:

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

Keduanya baik-baik saja dalam bentuk pernyataan panjang tetapi dalam pernyataan ternary mereka menjadi tidak perlu rumit seperti:

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

Anda juga dapat mencapai ini hanya dengan operator ternary seperti:

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

Tapi ... jika nilainya tidak ada (tidak disetel) itu akan menaikkan E_NOTICEdan bukan praktik terbaik. Jika nilainya nulltidak akan meningkatkan pengecualian.

Oleh karena itu operator ternary untuk penyelamatan membuat ini sedikit jawaban rapi:

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


Penjelasan hebat!
DasBen

4

Jika Anda ingin tahu apakah properti ada dalam instance kelas yang telah Anda tetapkan, cukup gabungkan property_exists()dengan isset().

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

1
Memanggil property_exists($this, $property)agak berlebihan di sini, karena kode Anda akan selalu memiliki hasil yang sama seperti isset($this->$property)sendirian.
MarthyM

Ini adalah pemeriksaan fakta yang lebih lengkap karena isset()tidak dapat memberi tahu Anda apakah properti adalah anggota sebenarnya dari definisi kelas. Saya akan mencari lagi nanti untuk memastikan.
Anthony Rutledge

Itu benar, output akan sama untuk properti kelas aktual. Jika Anda memiliki properti virtual dengan __get()dan lebih penting __isset()metode sulap, hasilnya akan berbeda dalam beberapa kasus.
MarthyM

1

Untuk memeriksa apakah sesuatu keluar, Anda dapat menggunakan fungsi PHP isset () lihat php.net . Fungsi ini akan memeriksa apakah variabel diatur dan bukan NULL.

Contoh:

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

Jika Anda perlu memeriksa apakah properti ada di kelas, maka Anda dapat menggunakan fungsi build in property_exists ()

Contoh:

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

1

Menggunakan array_key_exists () pada objek tidak digunakan lagi di php 7.4

Sebaliknya isset () atau property_exists () harus digunakan

referensi: php.net


0

Hanya menaruh 2 sen saya di sini.

Diberi kelas berikut:

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

berikut ini akan terjadi:

$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

Semoga ini bisa membantu siapa saja

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.