PHP - Ошибка при разборе строки с кодом - PullRequest
0 голосов
/ 04 марта 2010

У меня проблема с некоторым кодом, который работал в 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" 

для предотвращения его «оценки» (я не уверен, действительно ли это оценка).

Тем не менее, я все еще хотел бы знать причину этого странного поведения.

Крио: спасибо за помощь, я отмечу вопрос как ответивший через пару дней.

Ответы [ 2 ]

1 голос
/ 04 марта 2010

Cryo находится на правильном пути, хотя я думаю, что на самом деле проблема в том, что PHP оценивает переменные в строках в двойных кавычках. Однако косая черта должна препятствовать оценке переменной. Итак:

$a = "somestring"
$b = "\$a" // -> \$a
$c = '\$a' // -> \$a

Я думаю, что ваша строка вычисляется странным образом, так что \ + $ myVar вычисляется странным образом.

1 голос
/ 04 марта 2010

Я предполагаю, что PHP перехватывает повторное открытие тега php <?php, попробуйте разделить только это:

$str2 = "<?" . "php print( \$myVar$myVar2 );  ?>";

Или используйте одинарные кавычки и конкатенацию:

$str2 = '<?php print( $myVar' . $myVar2 . ' );  ?>';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...