本文解读

为什么在thinkphp3的自定义控制器中,打印输出未定义的变量和给未定义变量赋值没有异常提醒。 在基类魔术方法中打印输出,查看情况。

准备工作

  • 有一个已经能访问的ThinkPhp3站点
  • 开启trace
  • 开启日志记录

魔术方法__get()__set()的定义

如果自定义控制器继承了基类控制器,那么在自定义控制器中,打印输出和给未定义变量赋值不会有异常(未定义提醒)。 重构魔术方法__get($name)__set($name,$value)

<?php
    /**
     * 模板变量赋值
     * @access protected
     * @param mixed $name 要显示的模板变量
     * @param mixed $value 变量的值
     * @return Action
     */
    protected function assign($name,$value='') {
        $this->view->assign($name,$value);
        return $this;
    }

    public function __set($name,$value) {
        var_dump('__set_name_'.$name);
        var_dump('__set_value_'.$value);
        $this->assign($name,$value);
    }

    /**
     * 取得模板显示变量的值
     * @access protected
     * @param string $name 模板显示变量
     * @return mixed
     */
    public function get($name='') {
        return $this->view->get($name);      
    }

    public function __get($name) {
        var_dump('__get_'.$name);
        return $this->get($name);
    }

    /**
     * 检测模板变量的值
     * @access public
     * @param string $name 名称
     * @return boolean
     */
    public function __isset($name) {
        return $this->get($name);
    }

测试代码

DemoOneController类继承Controller基类

  • 定义了变量:$name
  • 未定义变量:$age
<?php
namespace Home\Controller;
use Think\Controller;

class DemoOneController extends Controller {

    public $name;
    protected function _initialize(){

    }
}

$a = new DemoOneController;
$a->name = 'DemoOne';
$a->age;
$a->age=100;

访问Url地址看输出情况

/index.php?s=/Home/DemoTwo/index.html string(9) "__get_age" string(14) "set_name_age" string(15) "set_value_100"

查看异常提示

  • 开启Trace信息查看,开启日志记录
  • 从Runtime\Logs中不会出现未定义提醒
    <?php
    /* 调试配置 */
    'SHOW_PAGE_TRACE' => true,
    'LOG_RECORD' => true, // 开启日志记录
    'LOG_LEVEL'  =>'EMERG,NOTICE,ALERT,CRIT,ERR,WARN,INFO,DEBUG,SQL', // 只记录EMERG ALERT CRIT ERR 错误
点赞(1) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部