php魔术方法__isset() and __unset( ) 实例应用

来源:互联网 发布:英文小说阅读软件 编辑:程序博客网 时间:2024/06/15 22:16

__isset()    – 在对类中属性或者非类中属性使用isset()方法的时候如果没有或者非公有属性,则自动执行__isset()的方法(简单理解除了属性public 以外都掉用)
__unset()  - 在对类中属性或者非类中属性使用unset()方法的时候如果没有或者非公有属性,则自动执行__unset()的方法

<?php

/*
__isset格式:bool __isset(string name)   //传入对象中的成员属性名作为参数,返回测定的结果

作用    :在类的外部使用“isset()”方法测定对象中的成员时,
            就会自动调用对象中的“__isset()”方法,
          间接地帮助我们完成对对象中私有成员属性的测定

直接在外部  isset(私有属性) 由于访问不了私有属性返回 false(即使该私有属性有值)
应用__isset( ),在外部执行isset(私有属性),就会自动调用对象中的“__isset()”方法,
然后 我们既可以在  __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();
?>

<?php//属性重载class Person{ //属性public$name;private$age;//构造方法publicfunction __construct($name,$age) { $this->name =$name;$this->age =$age; } }//实例化$person = new Person('罗纳尔多',35);//判断var_dump(isset($person->name));//truevar_dump(isset($person->age));//falsevar_dump(empty($person->name));//falsevar_dump(empty($person->age));//true


<?php//属性重载class Person{ //属性public$name;private$age;//构造方法publicfunction __construct($name,$age) { $this->name =$name;$this->age =$age; }//isset魔术方法 //需要一个参数知道要判断的属性的名字public function __isset($name){//新建一个允许判断的数据 //判断当前元素是否在允许判断的数组里 //如果允许,在内部判读,返回判断结果 //不允许,返回FALSEvar_dump($name);returnisset($this->$name);
//return empty($this->$name) //empty和isset外部所得到的结果 }}//实例化$person =new Person('罗纳尔多',35);//判断var_dump(isset($person->name));//true 能访问到,不经过__isset()魔术方法var_dump(isset($person->age));//true 访问不到,经过__isset()魔术方法,判断出age属性是存在的,返回truevar_dump(empty($person->name));//false 能访问到,不经过__isset()魔术方法var_dump(empty($person->age));//true 访问不到,经过__isset()魔术方法,判断出age属性是存在的,返回true(与逻辑不符,所以需要在__isset()函数内部做判断)
复制代码




<?php//魔术方法__isset __unset echo'<hr />';classDog{public $leg =4;protected $bone ='猪腿骨';publicfunction__isset($p){echo'你想判断我的',$p,'属性存不存在<br />';return1; } publicfunction__unset($p){echo'你想去掉我的',$p,'?!<br />'; } } $hua =new Dog();if(isset($hua->leg)) { echo $hua->leg,'<br/>'; } /*结果:4*/if(isset($hua->tail)) { echo'有tail属性'; } else {echo'没有tail'; } /*结果:你想判断我的tail属性存不存在有tail属性*//*** __isset() 方法, 当 用isset() 判断对象不可见的属性时(protected/private/不存在的属性) 会引发 __isset()来执行 问: isset($obj->xyz) 属性,为真, 能说明 类声明了一个xyz属性吗? 答:不能 ***/echo'<hr />';echo'__unset测试<br/>'; print_r($hua); /*结果:__unset测试Dog Object( [leg] => 4 [bone:protected] => 猪腿骨)*/unset($hua->leg); print_r($hua);/*结果:Dog Object( [bone:protected] => 猪腿骨)*/unset($hua->tail);unset($hua->bone);/*结果:你想去掉我的tail?!你想去掉我的bone?!*//*** __unset()方法 当 用unset 销毁对象的不可见属性时, 会引发 __unset(); unset($hua->tail)----没有tail属性---->__unset('tail'); ***/?>

阅读全文
0 0
原创粉丝点击