面向对象的PHP(二):property_exists 和 isset

本文探讨了PHP中类属性的私有、受保护和公共访问特性,通过实例展示了如何设置和获取属性值,并指出使用property_exists()和isset()检测属性存在的区别与限制。

一个简单的类:

<?php
class base {
    private $private_var;
    protected $protected_var;
    public $public_var;
    public function __construct($property_name, $value = FALSE) {
        $this->_set($property_name, $value);
    }
    private function _set($property_name, $value = FALSE) {
        $this->$property_name = $value;
    }
    public function get($property_name) {
        if(property_exists('base', $property_name)) {
            return $this->$property_name;
        }
        return NULL;
    }
}

测试文件:

#! /usr/bin/php
<?php
require('./base.class.php');
$base = new base('foo');
var_dump($base);
var_dump(property_exists('base', 'protected_var'));
var_dump(property_exists('base', 'foo'));
var_dump(isset($base->foo)); 

测试结果:

class base#1 (4) {
  private $private_var =>
  NULL
  protected $protected_var =>
  NULL
  public $public_var =>
  NULL
  public $foo =>
  bool(false)
}
bool(true)
bool(false)
bool(true)
 


以上结果说明向实例化的类中增加的公共属性,无法通过property_exists检测存在,那么只能通过isset检测。

但是,isset有一个明显缺点,即不能检测private和protected的属性。


解决办法应该是两个一起用,先使用property_exists, 然后使用isset。

### `property_exists` 方法的作用及使用示例 `property_exists` 是 PHP 提供的一个类/对象函数,用于检查指定的属性是否存在于给定的类或对象中,即使该属性的值为 `NULL`,该函数也会返回 `TRUE`。这与 `isset()` 不同,后者在属性值为 `NULL` 时会返回 `FALSE`[^4]。 此函数的语法为: ```php property_exists($object, $property) ``` 其中,`$object` 可以是类名的字符串形式,也可以是一个对象实例;`$property` 是要检查的属性名称。函数返回值为布尔类型,表示属性是否存在[^1]。 该函数常用于在运行时动态检查类或对象的属性是否存在,从而避免访问未定义属性时触发错误或异常。它在开发框架、ORM 映射、调试工具等场景中具有广泛的应用价值。 以下是一个使用 `property_exists` 的示例: ```php <?php class User { public $name; private $password; public function __construct($name, $password) { $this->name = $name; $this->password = $password; } } $user = new User("Alice", "secret"); // 检查 public 属性是否存在 var_dump(property_exists($user, 'name')); // 输出: bool(true) // 检查 private 属性是否存在 var_dump(property_exists($user, 'password')); // 输出: bool(true) // 检查不存在的属性 var_dump(property_exists($user, 'email')); // 输出: bool(false) // 检查属性值为 NULL 的情况 class Test { public $value = null; } $test = new Test(); var_dump(property_exists($test, 'value')); // 输出: bool(true) ``` 在实际开发中,`property_exists` 可以与反射机制结合使用,用于构建更健壮的动态类处理逻辑。例如,开发者可以在访问属性之前先进行存在性检查,从而避免运行时错误。 ### 与 `isset()` 的区别 `property_exists` 与 `isset()` 的关键区别在于,即使属性值为 `NULL`,`property_exists` 也会返回 `TRUE`,而 `isset()` 会返回 `FALSE`。因此,在需要判断属性是否定义的情况下,应使用 `property_exists`,而在判断属性是否有值时,应使用 `isset()`[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值