17-7类属性检测与删除__isset()和__unset()–PHP实战开发教程

17-7类属性检测与删除__isset()和__unset()–PHP实战开发教程

皇聘髓精录骏类替次存弗膜臀


魔术方法:
1.类中以双下划线开头的方法,这是由系统内置的,用户方法不要用双下划线开头;
2.魔术方法由系统在一定条件下自动触发调用,用户不能直接调用;

注意:将类中的私有成员前面添加单下划线是一个好习惯;
例如: private $_salary;    private function _listUsers(){…}

使用魔术方法实现几个对象访问拦截器
所谓拦截器:就是对用户的一些错误或非法访问进行检测和控制。

之前我们学过__get($fieldName)和__set()这是二个最常用的拦截器
现在我们再学习一组: __isset($fieldName)和__unset($fieldName)
1. __isset():当在类外检测一个类属性是否存在时会自动调用
2. __unset():当在类外销毁一个类属性时会自动调用  


新建demo7.php

<?php
class Demo
{
    private $name="mengmianren";
    private $email="mengmianren@123.com";
}
$demo=new Demo();
echo isset($demo->name) ? '有':'没有';

执行,虽然存在该属性,但是该属性是私有的,无权访问,提示不存在:

17-7类属性检测与删除__isset()和__unset()–PHP实战开发教程第1张


__isset()如果用户检测一个不存在或者无权访问的类属性时,会自动调用__isset

<?php
class Demo
{
    private $name="mengmianren";
    private $email="mengmianren@123.com";

    //如果用户检测一个不存在或者无权访问的类属性时,会自动调用__isset
    public function __isset($name)
    {
        return true;
    }
}
$demo=new Demo();
echo isset($demo->name) ? '有':'没有';

执行:

17-7类属性检测与删除__isset()和__unset()–PHP实战开发教程第2张


__isset()过滤

如果用户检测的是name属性,则不许检测,如果不是name属性则允许检测

<?php
class Demo
{
    private $name="mengmianren";
    private $email="mengmianren@123.com";

    //如果用户检测一个不存在或者无权访问的类属性时,会自动调用__isset
    public function __isset($name)
    {
        //如果用户检测的是name属性,则不许检测,如果不是name属性则允许检测
        return ($name=="name")?false:true;
    }
}
$demo=new Demo();
echo isset($demo->name) ? '有':'没有';
echo "<hr>";
echo isset($demo->email) ? '有':'没有';

执行:

17-7类属性检测与删除__isset()和__unset()–PHP实战开发教程第3张


unset销毁属性:

<?php
class Demo
{
    private $name="mengmianren";
    private $email="mengmianren@123.com";

    //如果用户检测一个不存在或者无权访问的类属性时,会自动调用__isset
    public function __isset($name)
    {
        //如果用户检测的是name属性,则不许检测,如果不是name属性则允许检测
        return ($name=="name")?false:true;
    }
}
$demo=new Demo();
unset($demo->name);

执行,提示属性私有,不允许销毁

17-7类属性检测与删除__isset()和__unset()–PHP实战开发教程第4张


当外部如果有unset()时,会自动调用__unset()

允许销毁email属性

<?php
class Demo
{
    private $name="mengmianren";
    private $email="mengmianren@123.com";

    //如果用户检测一个不存在或者无权访问的类属性时,会自动调用__isset
    public function __isset($name)
    {
        //如果用户检测的是name属性,则不许检测,如果不是name属性则允许检测
        return ($name=="email")?false:true;
    }
    //当外部如果有unset()时,会自动调用__unset()
    public function __unset($name)
    {
        if($name=='email')//如果是name属性,则允许销毁
        {
            unset($this->$name);
        }
    }
}
$demo=new Demo();
unset($demo->email);
echo isset($demo->email)?'存在':'不存在';

执行:

17-7类属性检测与删除__isset()和__unset()–PHP实战开发教程第5张


这两个方法了解即可,工作中基本不会用


写冉绦精酥栖线佬试脐晃枫寝