用了一段时间的公司框架,发现在controller上动态加上的属性,在view里要额外判断才能正确无误的输出,那么能利PHP5类的特性来简化代码呢?我实现了一下,测试可行。还请大师审视!let me go!
我在Controller里写入一个demoController.php代码如下:
<?php class DemoController extends __Application { public function indexAction() { return false; } public function testaAction() { $this->dynamicPro = '这是动态添加的属性'; return $this->render(self::VIEW, 'demo'); } public function testbAction() { return $this->render(self::VIEW, 'demo'); } }
然后View层里新建demo.phtml
<?php echo '这里输出属性: '.$this->$dynamicPro;
然后我们浏览器里分别运行:testa 控制器和testb 控制器
http://localhost/MST_v3.1/demo/testa
http://localhost/MST_v3.1/demo/testb
testa:
testb:
测试结果得出:
在controller中,动态添加的属性在View中没加入判断会报出个Undefind Property错误提示!那怎么解决?一种当然是代码上去控制,另一种是开头所说的PHP5中的魔术方法!
第一种解决方式:
我们先把View中的demo.phtml代码改为如下:
<?php $dynamic = isset($this->dynamicPro)? $this->dynamicPro : ''; echo '这里输出属性: '. $dynamic;
好了,刷新testb控制器,如下图,没报错!
第二种解决方式:
现在重点要说的 我们要简化代码,所以要修改下框架的lib\MST_v3.1\MST\ActionView.php 在类中加入下面__get和__set魔术方法:
public function __get($property_name) { if(isset($this->$property_name)) { return($this->$property_name); }else { return(NULL); } } public function __set($property_name, $value){ $this->$property_name = $value; }
好了View中的demo.phtml改回原来的代码方式:
<?php echo '这里输出属性: '.$this->dynamicPro;
然后刷新你的浏览器,不会再报错,这样免去了我们判断动态加入的属性判断,还算挺方便的!
报错是为了更好的调试,什么都不报错,你怎样去调试……
规范一下写法就可以免除你说的情况,例如声明一下变量的默认值。
看到大湿这么一说,按规范写的提议,我又对大湿的敬仰犹如滔滔江水连绵不绝!
小弟没用过这框架,不知道是怎么样的!
如果看代码的话,用魔术函数,那应该不需要判断了吧
我觉得这样简化
public function __get($property_name) {
return(NULL);
}
if(isset($this->$property_name)) {
return($this->$property_name);
}else {
return(NULL);
}
当然不能像你这样说法简化,你看条件判断,如果有设置这个属性,返回这个属性,而你的直接返回null