• 解析魔术方法之__set,__get,__isset,__unset


    简单来说,这4个魔术方法的意义在于强调控制权:

    对于不可见的属性(不存在或者protected/private)进行上述四种操作前,如果定义上述4种魔术变量,即会预先执行.

    <?php
    class one{
        public $name='rainn';
        protect $car='bmw';
        private $age=24;
    }
    $man=new one();
    $man->name='wang';

    $man->height='188cm';
    $man->age=21;
    ?>

    set的过程如$man->name='wang';$man->age=21;$man->height='188cm';

    如上,可见属性为name,所以name的属性是可以被set的,而age属性不可见(protected),height属性不存在,因为没有设置__set方法而可以设置,所以如果执行这段代码,会设置height成功而不会设置age成功.

    当class中未声明 public function __set时,默认无法set不可见(protected/private)属性,而可以set不存在属性.

    如果想要在外部set一个不可见属性时,则需要如下方式写入class one

    class one{
      public .....
      protected ...
      private ....
      public function __set($name,$value){
           $this->$name=$value;
      }
    }

    如此的话,再次set已存在不可见属性时,就会调用class内部方法,从而可以忽视protected或者private权限.

    如果想禁止外部set不存在属性,则只需要在class内部声明一个空的public function __set($a,$b){},即可以禁止外部添加不存在属性.

    同理,__get($a)为外部查看属性时预先运行的方法,当没有声明__get()时,外部查看一个不存在属性时,会提示该属性不存在,而查看不可见属性时则提示属性不可访问受保护属性,所以如果想在外部访问不可见属性时,只需加入如下代码

    class one{
    public ....;
    protected ...
    private ....
    public function __get($a){
     return $this->$a;
    }
    }

    __isset,则是在外部isset不可见或不存在属性时,预运行该方法,当没有设置该方法或者设置为空时,外部isset不可见属性或者不存在属性都将返回false;

    在此要强调一个控制权的问题;

    当没有声明__isset或者声明一个空__isset时,外部的返回值为false,通俗的来看,可是说是coder没有给isseter权限去查询而告诉他不存在这个属性(false)(假设类声明者coder与类外查询者inseter)在两个环境下,那么coder在class内部设置__isset的内容即是coder想要告诉的isseter的内容,如果在__iseet()中return true,则代表无论查询者查询什么,都会显示ture,无论他查询的这个属性是否真的存在.

    class one{
     protected $name='a';
     public function __isset(){
    return ture;
    }
    }
    $jim=new one();
    var_dump($jim->name);
    var_dump($jin->age);
    

      如以上代码,name存在查询是返回ture,而age实际不存在,也会返回true,与实际不相符,却给你表明了权限问题呢,就是,coder说是真就是真,不是真也是真.

    如果你想当一个诚实的coder,那么你可以进行如下操作

    class one{
    ....
    public function __isset($a){
    return isset($this->$a);
    }
    }
    

      如此就可以进行正确的查询;

    __unset的原理也差不多,当不设置__unset时,可以unset掉存在的可见属性,而不可见属性则会提示不能销毁被保护属性,如果你想要unset掉一个保护属性的话,则需要加入如下代码

    class one{
    ....
    public function __unset($a){
    unset($this->$a)
    }
    }
  • 相关阅读:
    luogu P2827 蚯蚓
    CHOI1001/1002 火车进出栈问题
    hdoj4699 Editor
    反弹shell监控
    AppScan 9.0.3.6 crack
    Spectre & Meltdown Checker – CPU芯片漏洞检查脚本Linux版
    Microsoft IIS WebDav 'ScStoragePathFromUrl' Remote Buffer Overflow (CVE-2017-7269)
    Shodan新手使用指南
    The Art of Subdomain Enumeration (转)
    DDOS攻击方式总结 (转)
  • 原文地址:https://www.cnblogs.com/himitsu/p/4846205.html
Copyright © 2020-2023  润新知