💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
**__isset()**   在对类中属性或者非类中属性使用isset()方法时如果**没有**或者**非公有属性**,则自动执行__isset()的方法(简单理解除了属性public 以外都调用) **__unset()** 在对类中属性或者非类中属性使用unset()方法的时候如果**没有**或者**非公有属性**,则自动执行__unset()的方法 ``` <?php /* __isset格式:bool __isset(string name)传入对象中的成员属性名作为参数,返回测定的结果 作用 :在类的外部使用“isset()”方法测定对象中的成员时, 就会自动调用对象中的“__isset()”方法, 间接地帮助我们完成对对象中私有成员属性的测定 __unset格式:void __unset(string name) //传入对象中的成员属性作为参数 作用 :可以将私有成员属性删除如果没有在类中加入此方法, 就不能删除对象中任何的私有成员属性。 */ class Employee { private $name; private $sex; private $salary; function __construct($name="",$sex="男",$salary=3000) { $this->name=$name; $this->sex=$sex; $this->salary=$salary; } function __isset($propertyName) { if($propertyName=="salary")//$propertyName是属性名的意思 return false; return isset($this->$propertyName); // $propertyName 是私有的外部不能直接判断 必须先通过__isset 进而就可以判断 //当在外面使用__isset()测定私有成员属性时,__unset方法被自动调用 //并在内部把私有的成员属性删除 } function __unset($propertyName) { if ($propertyName=="salary" || $propertyName=="name") return; unset($this->$propertyName); } public function getInfo() { echo "我的名字:".$this->name.",性别:".$this->sex.",工资:".$this->salary."<br>"; } } $e=new Employee("奥巴马","男",20000); var_dump(isset($e->name)); echo "<br>";//输出bool为false,不允许测定name属性 var_dump(isset($e->sex)); echo "<br>"; var_dump(isset($e->salary)); echo "<br>"; var_dump(isset($e->id));//输出bool(false),测定对象中不存在id的属性 unset($e->sex);//删除对象中的私有属性sex 删除成功 unset($e->salary);//删除对象中私有属性salary,删除不成功 $e->getInfo(); ?> ``` ## **注意:** 直接在外部 isset(私有属性) 由于访问不了私有属性返回 false(即使该私有属性有值) 应用__isset( ),在外部执行isset(私有属性),就会自动调用对象中的“__isset()”方法, 然后 我们既可以在 __isset()”方法内 isset(私有属性) 得到准确的值, 简而言之:**间接**地帮助我们完成对对象中**私有成员属性**的测定 ***** 通过 __isset()的方法 才能正确检查 isset() 否则isset永远是false ***** __isset 和 __unset 是 PHP 中的两个魔术方法(Magic Methods),用于在访问或修改类的属性时提供特定的行为。它们分别用于检测属性是否存在和删除属性。 __isset 方法: 当对一个对象的属性使用 isset() 函数进行检测时,如果该属性不存在或不可访问,PHP 将会调用类中定义的 __isset 方法。 __isset 方法接收一个参数,即要检测的属性名,然后返回一个布尔值,指示该属性是否存在或是否具有非空值。 以下是 __isset 方法的示例: ``` class MyClass { private $data = array(); public function __isset($name) { return isset($this->data[$name]); } } $obj = new MyClass(); isset($obj->property); // 调用 __isset 方法 ``` 在上述示例中,当使用 isset($obj->property) 检测 $obj 对象的 property 属性时,PHP 将调用 MyClass 类中定义的 __isset 方法。__isset 方法检查属性名是否存在于 $data 数组中,并返回相应的布尔值。 __unset 方法: 当对一个对象的属性使用 unset() 函数进行删除时,如果该属性不存在或不可访问,PHP 将会调用类中定义的 __unset 方法。 __unset 方法接收一个参数,即要删除的属性名,然后执行相应的操作。 以下是 __unset 方法的示例: ``` class MyClass { private $data = array(); public function __unset($name) { unset($this->data[$name]); } } $obj = new MyClass(); unset($obj->property); // 调用 __unset 方法 ``` 在上述示例中,当使用 unset($obj->property) 删除 $obj 对象的 property 属性时,PHP 将调用 MyClass 类中定义的 __unset 方法。__unset 方法从 $data 数组中删除相应的属性。 通过定义 __isset 和 __unset 方法,我们可以自定义类在属性访问和删除过程中的行为。这可以用于提供属性的动态访问控制、属性值的惰性加载、日志记录等功能。