我遇到了一些以前在PHP 4.X中工作但在PHP 5.2.4中无法运行的代码的问题
首先,有一个类似于导致问题的代码的小例子。不幸的是,我无法通过一个小例子来重现这个问题。
<?php
class Example{
public function showExample()
{
$ind = 1;
$m = "method";
$str2 = "{call method}";
$str2 = str_replace("{call $m}" , "<?php print( \$pre$ind ); ?>", $str2);
echo $str2 . "\n";
}
}
$e = new Example();
$e -> showExample();
?>
这段代码正在构建一个带有一些php代码的字符串,以便稍后执行。特别是,生成的代码将打印名为“$ pre”+变量号的变量的值。在这种情况下,输出如下:
<?php print( $pre1 ); ?>
使用此代码,一切运行正常。问题是当我在更大的类的上下文中使用它时,这是我已经使用了很长时间的框架的一部分。我不能在这里粘贴类的整个源代码,但有问题的行如下(我简化它们以删除str_replace,但错误仍然出现):
$myVar = "value";
$myVar2 = 2;
$str2 = "<?php print( \$myVar$myVar2 ); ?>";
当我加载文件时,我收到以下两条消息:
PHP Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /Users/giove/Sites/mundial/htmltemplate.php on line 252
PHP Parse error: syntax error, unexpected T_VARIABLE in /Users/giove/Sites/mundial/htmltemplate.php on line 252
我可以通过删除'\'来修复警告,但这会改变代码的语义,所以这不是真正的可能性。
现在,最奇怪的部分是我可以通过破坏或删除序列来删除这两个错误“
这似乎是版本的差异,但我无法在更改日志中找到任何提及。
现在我有了Cryo的工作解决方案:拆分字符串
"<?php"
防止其“评估”(我不确定这是否真的是评估)。
尽管如此,我仍然想知道这种奇怪行为的原因。
Cryo:感谢您的帮助,我会在几天内将问题标记为已回答。
答案 0 :(得分:1)
我的猜测是PHP正在重新开启php标签<?php
,尝试拆分:
$str2 = "<?" . "php print( \$myVar$myVar2 ); ?>";
或使用单引号和连接:
$str2 = '<?php print( $myVar' . $myVar2 . ' ); ?>';
答案 1 :(得分:1)
Cryo在正确的轨道上,虽然我认为实际的问题是PHP评估双引号字符串中的变量。但是,斜杠应该阻止对变量进行求值。所以:
$a = "somestring"
$b = "\$a" // -> \$a
$c = '\$a' // -> \$a
我认为你的字符串会以奇怪的方式进行评估,以便以奇怪的方式评估\ + $ myVar。