解决php smarty 2.x register_object方法不支持多级对象方法调用的问题
2012-12-04 16:06
876 查看
由于smarty3速度慢,内存消耗大所以还是选择smarty2比较好。
以最小破坏源码为前提,以当前最新版smarty 2.6.27为例
打开smarty目录下Smarty_Compiler.class.php
找到184行
找到848行
找到904行,添加一行代码
应用场景
模板里可以这样调用,由register_object 第四个参数决定
{myobj->field->method arg1=1 arg2=2} //这里method函数接受的是数组array('arg1'=>,'arg2'=>2)
或
{myobj->field->method(1,2)}
不传参数就是调用属性了,比如{myobj->field->method}这是调用属性,这里就不支持没有参数的方法调用了,因为没有这种需要。
以最小破坏源码为前提,以当前最新版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,}';
找到848行
//list($object, $obj_comp) = explode('->', $tag_command); //提取对象名和后续的对象属性及方法名 list($object, $obj_comp) = explode('->', $tag_command,2);
找到904行,添加一行代码
$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()); ?>
模板里可以这样调用,由register_object 第四个参数决定
{myobj->field->method arg1=1 arg2=2} //这里method函数接受的是数组array('arg1'=>,'arg2'=>2)
或
{myobj->field->method(1,2)}
不传参数就是调用属性了,比如{myobj->field->method}这是调用属性,这里就不支持没有参数的方法调用了,因为没有这种需要。
相关文章推荐
- php 中的重载技术——解决调用对象(或类)的未定义的属性或方法出错问题
- php5.3 不支持 session_register() 此函数已启用的解决方法
- php警告Creating default object from empty value 问题的解决方法
- 农行动态口令卡问题解决方案(Key:Vista,IE7,证书已锁定,438对象不支持此属性或方法)
- apach配置php,cgi支持遇到的一些问题解决方法
- [iOS] performSelector:withObject:afterDelay:调用没有作用的问题及解决方法
- 解决session关闭时再调用对象方法时报session已关闭问题
- PHP调用存储过程返回值不一致问题的解决方法分析
- 关于js调用ocx控件报错"对象不支持此属性或方法"的解决方法
- [iOS] performSelector:withObject:afterDelay:调用没有作用的问题及解决方法
- PHP调用Linux命令权限不足问题解决方法
- 解决QProcess对象调用execute执行cmd命令不支持中文和空格的问题
- 解决session关闭时再调用对象方法时报session已关闭问题
- 解决session关闭时再调用对象方法时报session已关闭问题
- [iOS] performSelector:withObject:afterDelay:调用没有作用的问题及解决方法
- 解决“ .dll(或.ocx)控件已加载,但对DllregisterServer的调用失败,错误代码为0x80004005”问题的两种终极方法:SubInACL安装 VS 命令提示符
- PHP中调用SVN命令更新网站方法(解决文件名包含中文更新失败的问题)
- DllRegisterServer的调用失败的问题解决方法
- PHP调用Linux命令权限不足问题解决方法
- 在PHP调用JS中的方法,以此来解决浏览器兼容问题