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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25275355/article/details/78485573

__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)); //true var_dump ( isset ( $person ->age)); //false var_dump ( empty ( $person ->name)); //false var_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 ){ //新建一个允许判断的数据 //判断当前元素是否在允许判断的数组里 //如果允许,在内部判读,返回判断结果 //不允许,返回FALSE var_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属性是存在的,返回true var_dump ( empty ( $person ->name)); //false 能访问到,不经过__isset()魔术方法 var_dump ( empty ( $person ->age)); //true 访问不到,经过__isset()魔术方法,判断出age属性是存在的,返回true(与逻辑不符,所以需要在__isset()函数内部做判断)
复制代码




<?php //魔术方法__isset __unset echo '<hr />' ; class Dog { public $leg = 4 ; protected $bone = '猪腿骨' ; publicfunction __isset ($p){ echo '你想判断我的' ,$p, '属性存不存在<br />' ; return 1 ; } 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'); ***/ ?>

猜你喜欢

转载自blog.csdn.net/qq_25275355/article/details/78485573