博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php ob_start callback failed
阅读量:6316 次
发布时间:2019-06-22

本文共 1265 字,大约阅读时间需要 4 分钟。

今天在解决一个模板替换的问题的时候用到了PHP缓冲,遇到了非常蛋疼的问题。

原源代码是这样写的:

1 $array = array( 2    'name' => '张三', 3    'gift' => 'xphone' 4 ); 5 $template = '你好 {name}, 你中了大奖 {gift}.'; 6                 7 function callback($buffer) { 8    global $array; 9    foreach($array as $key=>$value) {10       $buffer = str_ireplace('{'.$key.'}', $value, $buffer);11    }12    return $buffer;13 }14                15 ob_start("callback");16 echo $template;17 $new_tpl =  ob_get_contents();18 ob_clean();19 echo $new_tpl;

通过这样的方式来实现一个简单的模板替换功能。

但是这样的代码并没有像我想的那样顺利的执行。

将代码剥离出来,直接运行完全没问题。

考虑是否是框架问题,或者是php结束符后多余行的问题,一一排除。

一阵蛋疼,后来google了一番,总算是找到了原因和解决方法。

global is evil!

 

重新修改如下:

1 $array = array( 2    'name' => '张三', 3    'gift' => 'xphone' 4 ); 5 $template = '你好 {name}, 你中了大奖 {gift}.'; 6               7 ob_start(function($buffer) use ($array) { 8    foreach($user as $key=>$value) { 9       $buffer = str_ireplace('{'.$key.'}', $value, $buffer);10    }11    return $buffer;12 });13 echo $template;14 $new_tpl =  ob_get_contents();15 ob_clean();16 echo $new_tpl;

主要的原因就是,从php5.2开始 任何object都会在ob_start之前被摧毁。

所以此处$array在实际code中其实是object中的variable。

这里使用use ($array)替代 global $array 来keep this variable alive 一直到脚本执行结束。

这样的话$array就不会在ob_start的时候被内存回收机制干掉了。

转载于:https://www.cnblogs.com/rand7/p/3663690.html

你可能感兴趣的文章
C语言将字符串转换成对应的数字(十进制、十六进制)【转】
查看>>
据说每个大牛、小牛都应该有自己的库——框架篇
查看>>
EntityFramework之原始查询如何查询未映射的值,你又知道多少?
查看>>
target_list 中的 list_make1 的含义
查看>>
PLSQL DBMS_DDL.ALTER_COMPILE
查看>>
[Step By Step]SAP HANA PAL多元指数回归预测分析Multiple Exponential Regression编程实例EXPREGRESSION(模型)...
查看>>
法线贴图是用来解决低模的细节表现问题
查看>>
Adobe AIR中使用Flex连接Sqlite数据库(2)(添加,删除,修改以及语句参数)
查看>>
Unity容器中的对象生存期管理
查看>>
eclipse加入git工具
查看>>
[Erlang 0035] Erlang SMP
查看>>
6.4. ruby
查看>>
【Swift 3.0】iOS 国际化切换语言
查看>>
BZOJ 1411&&Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
查看>>
ECJTUACM16 Winter vacation training #1 题解&源码
查看>>
jsp中如何整合CKEditor+CKFinder实现文件上传
查看>>
前后台交互经常使用的技术汇总(后台:Java技术,前台:Js或者Jquery)
查看>>
【java规则引擎】之规则引擎解释
查看>>
Radware:金融机构如何应对日益猖獗的网络攻击
查看>>
Java中注释的使用是有原则的
查看>>