$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
直接变量引入就是
|