PHP ตรวจสอบว่าคุณสมบัติมีอยู่ในวัตถุหรือคลาส


159

ฉันเข้าใจ PHP ไม่มีตัวแปรวัตถุบริสุทธิ์ แต่ฉันต้องการตรวจสอบว่าทรัพย์สินอยู่ในวัตถุหรือคลาสที่กำหนดหรือไม่

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

หรือ

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

ในJSฉันสามารถเขียนสิ่งนี้เพื่อตรวจสอบว่าตัวแปรaมีอยู่ในวัตถุหรือไม่:

if ('a' in ob)

ในPHPสามารถทำสิ่งนี้ได้หรือไม่?

ขอบคุณมากสำหรับคำแนะนำของคุณ


2
เพียงกล่าวถึง ... เมื่อเราทำ OOP เราพูดว่าคุณสมบัติไม่ใช่ตัวแปรเช่นเราพูด method ไม่ทำงาน
Christopher Bonitz

คำตอบ:


254

property_exists (ผสม $ class, string $ property)

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

isset (ผสม $ var [ผสม $ ... ])

if (isset($ob->a))

isset () จะคืนค่า false หากคุณสมบัติเป็นโมฆะ

ตัวอย่างที่ 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

12
ไม่จำเป็นว่าถ้ามีคุณสมบัติอยู่ แต่ไม่ได้กำหนด isset () จะส่งคืนค่าเท็จ us3.php.net/manual/en/types.comparisons.php
Mitchell

isset () สามารถใช้ร่วมกับ empty () เพื่อตรวจสอบทั้งคุณสมบัติและค่า

4
ในขณะที่ isset () เป็นคำตอบที่ไม่ถูกต้องหากคุณทราบข้อควรระวังมันเร็วกว่า property_exists ()
Nico Westerdale

นี่เป็นสถานการณ์ที่empty()เป็นทางออกที่ดีกว่าหรือไม่ !empty($var)?
b_dubb

1
@b_dubb ไม่, อาร์เรย์ว่าง, 0, เท็จ, null, '' ทั้งหมดคืนค่าจริงโดย `empty () '
Peter

61

ในการตรวจสอบว่ามีทรัพย์สินอยู่หรือไม่และคุณสามารถใช้ฟังก์ชันproperty_exists()นี้ได้

เอกสาร: http://php.net/manual/th/function.property-exists.php

ซึ่งตรงข้ามกับ isset () property_exists () จะส่งกลับค่า TRUE แม้ว่าคุณสมบัติจะมีค่า NULL

bool property_exists (ผสม $ class, string $ property)

ตัวอย่าง:

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

7
ควรทำเครื่องหมายว่าเป็นคำตอบที่ยอมรับได้เนื่องจากคำตอบนั้นเป็นคำตอบที่ชัดเจนมาก isset ไม่มีประโยชน์สำหรับการทดสอบการมีอยู่ของคุณสมบัติในวัตถุ
Christopher Bonitz

11

ทั้งissetหรือproperty_existsทำงานสำหรับฉัน

  • issetส่งคืนค่า false ถ้าคุณสมบัติมีอยู่ แต่เป็น NULL
  • 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
        }
    }

property_exist + คุณสมบัติ unset อาจทำให้เกิดพฤติกรรมบั๊กกี้ นี่น่าจะเป็นวิธีที่ปลอดภัยที่สุด
Thanh Trung

array_key_exists () เลิกใช้แล้วใน php 7.4
Ali_Hr

คำสำคัญใน "การใช้ array_key_exists () บนวัตถุนั้นเลิกใช้แล้ว" เป็นวัตถุ get_object_vars () ส่งคืนอาร์เรย์ดังนั้นเรายังดีอยู่
smariot

7

สารละลาย

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';


คำอธิบายที่ดี!
DasBen

4

หากคุณต้องการที่จะทราบว่าทรัพย์สินที่มีอยู่ในตัวอย่างของการเรียนที่คุณได้กำหนดไว้เพียงแค่รวมกับproperty_exists()isset()

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

1
การโทรproperty_exists($this, $property)เป็นเรื่องซ้ำซ้อนที่นี่เนื่องจากรหัสของคุณจะมีผลเหมือนisset($this->$property)กันเสมอ
MarthyM

นี่เป็นการตรวจสอบข้อเท็จจริงที่สมบูรณ์มากขึ้นเพราะisset()ไม่สามารถบอกคุณได้ว่าทรัพย์สินเป็นสมาชิกที่แท้จริงของคำจำกัดความของชั้นเรียนหรือไม่ ฉันจะค้นหาอีกครั้งในภายหลังเพื่อให้แน่ใจ
Anthony Rutledge

นั่นเป็นความจริงเอาต์พุตจะเหมือนกันสำหรับคุณสมบัติคลาสจริง หากคุณมีคุณสมบัติเสมือนจริง__get()และที่สำคัญกว่า__isset()เวทมนตร์วิธีการส่งออกจะแตกต่างกันในบางกรณี
MarthyM

1

เพื่อตรวจสอบว่าบางสิ่งบางอย่างออก, คุณสามารถใช้ฟังก์ชัน PHP isset () ดู php.net ฟังก์ชั่นนี้จะตรวจสอบว่าตัวแปรถูกตั้งค่าและไม่ใช่ NULL

ตัวอย่าง:

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

ถ้าคุณต้องการตรวจสอบว่ามีคุณสมบัติอยู่ในคลาสหรือไม่คุณสามารถใช้ฟังก์ชัน build ในคุณสมบัติ property_exists ()

ตัวอย่าง:

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

1

การใช้ array_key_exists () บนวัตถุถูกคัดค้านใน php 7.4

ควรใช้ isset () หรือ property_exists () แทน

การอ้างอิง: php.net


0

เพียงแค่ใส่ 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

หวังว่านี่จะช่วยทุกคน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.