由于smarty3速度慢,内存消耗大所以还是选择smarty2比较好。
以最小破坏源码为前提,以当前最新版smarty 2.6.27为例
打开smarty目录下Smarty_Compiler.class.php
找到184行
//$this->_reg_obj_regexp = '[a-zA-Z_]\w*->[a-zA-Z_]\w*'; //以支持多级对象语法标签的提取 $this->_reg_obj_regexp = '[a-zA-Z_]\w*(?:->[a-zA-Z_]\w*){1,}';
//list($object, $obj_comp) = explode('->', $tag_command); //提取对象名和后续的对象属性及方法名 list($object, $obj_comp) = explode('->', $tag_command,2);
$return = "\$this->_reg_objects['$object'][0]->$obj_comp" //多级对象会被解析成属性,在此下手,调用方法必须传入smarty标签属性标注 strpos($obj_comp,'->')>0&&$args and $return.="($args)";
应用场景
<?php class a{ public $field; function __construct(){ $this->field=new b(); } } class b{ public function method($array){ echo 'execute method'; } } $smarty=new smarty(){ $smarty->register_object('myobj',new a()); ?>
不传参数就是调用属性了,比如{myobj->field->method}这是调用属性,这里就不支持没有参数的方法调用了,因为没有这种需要。