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)