
$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 Aug 23, 2017 |
3 lzjV2EX Aug 23, 2017 $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 Aug 23, 2017 没明白为什么要这么搞 |
6 1010011010 OP |
7 ywisax Aug 23, 2017 直接用 smarty 或 twig 就行了 |
8 eecjimmy Aug 24, 2017 via iPhone 直接变量引入就是 |