$template = '\$foo is {$foo}';// 注意是单引号 $result = templateReplace($template); // $result = '$foo is 114514' function templateReplace($template) { $foo = '114514'; return eval('return "' . $template . '";'); }
这能起到 php 双引号替换变量的效果,区别是能回调,像个闭包。
但是用 eval 总感觉不太好,有没有其他办法?
还有问题:php 执行双引号替换变量的时候,调用了什么?用户要怎么调用?有这样的函数吗?
主题的函数有点混乱,我改进了一下
function factory() { $template = '\$foo is {$foo}'; return function(Array $_parameters) use ($template) { extract($_parameters); return eval('return "' . $template . '";'); }; } $closure = factory(); $closure(['foo' => 'hallo']);// 返回 $foo is hallo $closure(['foo' => 'world']);// 返回 $foo is world
我觉得还是偷懒用 eval 得了
![]() | 1 1010011010 OP 为什么没出现在 全部 节点啊?来个人啊 |
![]() | 2 jfcherng 2017-08-23 19:44:02 +08:00 |
![]() | 3 lzjV2EX 2017-08-23 19:55:49 +08:00 $template = '\$foo is {$foo}'; $foo = "abc"; $count = preg_match_all('/\{\$([a-zA-Z_]\w*)\}/', $template, $matches); if ($count > 0) { foreach ($matches[1] as $varName) { if (isset(${$varName})) { $template = str_replace('{$'. $varName .'}', ${$varName}, $template); } } } |
![]() | 4 1010011010 OP @lzjV2EX #3 正则替换最多也就到 #2 那个类库的程度了,但是 php 一个双引号,就能完成那个类库的基本功能(字符串替换) 双引号还能替换属性:`"{$foo->bar[0]}"`,还有奇怪的动态变量:`"${foobar::getName()}"` |
![]() | 5 hheedat 2017-08-23 20:31:33 +08:00 没明白为什么要这么搞 |
![]() | 6 1010011010 OP |
![]() | 7 ywisax 2017-08-23 21:32:53 +08:00 直接用 smarty 或 twig 就行了 |
8 eecjimmy 2017-08-24 12:32:59 +08:00 via iPhone 直接变量引入就是 |