PHP 魔术方法 - __isset()
在我们讨论 __issset()
魔术方法之前,我们先来讨论下 isset()
方法。 isset()
方法主要用于判断一个变量或实例的一个属性是否定义。
如果变量或实例的属性不存在,或被赋值为 NULL
,就会返回 false
,其它情况下一律返回 true
,哪怕被赋值为 false
、0
、''
isset()
通常用于判断某个变量是否设置,当然,也可以在实例的外部判断实例的某个属性是否设置,这通常有两个场景
- 如果参数是一个公开 ( public ) 的属性,那么可以直接使用
isset()
来判断该属性是否设置 - 如果参数是一个私有 ( private ) 的属性,那么
isset()
就不能正常工作了
那么对于私有的属性,我们就判断它是否设置了吗 ?
当然不是,只要我们在类中定义了魔术方法 __isset()
,那么就可以在实例的外部使用 isset()
方法来判断某个私有属性是否设置
魔术方法 __isset()
只要一个类定义了 __isset()
魔术方法,我们就可以使用 isset()
来判断类的实例的某个私有属性是否 「 设置 」
这个 「 设置 」 我们加了中文竖括号,原因是 __isset()
内部判断是否设置的标准可以不是 NULL
。也就是说
「 只要 __isset()
方法返回 true
,那么 isset()
方法就返回 true
,反之,则返回 false
」
当定义了 __isset()
魔术方法后,只要使用 isset()
方法实例的私有属性或不存在的属性,都会自动调用 __isset()
魔术方法
该方法的原型如下
public bool function __isset( $propertyName ) { // 其它代码 }
该方法接收一个且只有一个参数,那就是要判断的属性名,而返回值为一个 bool 类型
范例
下面的代码,我们故意设置 $name
变量为公开可见的,$age
变量默认为 private
的,且忽略定义 $sex
变量,然后我们看看 __isset()
方法的返回值
<?php class Person { public $name; private $age; private $phone; public function __construct($name="", $age=25) { $this->name = $name; $this->age = $age; } /** * @param $content * * @return bool */ public function __isset($property) { echo "{$property} 属性是私有的或为定义, __isset() 方法会被自动调用\n"; return isset($this->$property); } } $person = new Person("Yufei", 25); // Initially assigned. var_dump(isset($person->name)); echo "\n\n"; var_dump(isset($person->age)); echo "\n\n"; var_dump(isset($person->sex)); echo "\n\n"; var_dump(isset($person->phone)); echo "\n\n";
输出结果如下
[yufei@localhost php]$ php demo.php bool(true) age 属性是私有的或为定义, __isset() 方法会被自动调用 bool(true) sex 属性是私有的或为定义, __isset() 方法会被自动调用 bool(false) phone 属性是私有的或为定义, __isset() 方法会被自动调用 bool(false)