thinkphp 控制器unset删除对象变量失败。。

  今儿开发过程中发现 tp是unset 变量失败。。具体代码

foreach( $this->menu as $k => $v){
    if(0 == $v['flag'])
         unset($this->menu[$k]);
}

逻辑很简单。。但是居然没过滤掉menu里面的值。。

一番折腾后发现居然是 TP 底层重写了 __set __get 造成的 具体代码

    public function __construct()
    {
        //实例化视图类
        $this->view       = Think::instance('View');
        //控制器初始化
        if(method_exists($this,'_initialize'))
            $this->_initialize();
    }
    public function __set($name,$value) {
        $this->view->assign($name,$value);
    }
    public function __get($name) {
        return $this->view->get($name);
    }

 具体就类似这种

class af{
   public $v =array();
   function __construct(){
       
   }
   function __set($k , $v){
      echo "set".$k;
      $this->v[$k] = $v;
   }
   function __get($k){
      echo "get".$k;
      return $this->v[$k];
   }

}
class a extends af{
    function __construct(){
       parent::__construct();
    }
    function t(){
         $this->aaa = array(1=>array(),3=>array(1,2), 2=>array(4,5,7));
         foreach($this->a as $k=>$v){
                if($k ==1){
                   unset($this->a[$k]);
                }
         }
         print_r($this->a);
    }
}
$aaa = new a();
$aaa->t();

希望能帮到以后碰到这个BUG的朋友。。

原文地址:https://www.cnblogs.com/glory-jzx/p/3443511.html