本文解读
为什么在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 错误
发表评论 取消回复