PHP - kodu ile bir dize ayrıştırma hatası

2 Cevap php

Ben PHP 4.X çalışmak ve PHP 5.2.4 çalışmıyor kullanılan bazı kod ile bir sorun yaşıyorum

Her şeyden önce, soruna neden olan benzer bir kod küçük bir örneği var. Ne yazık ki, ben küçük bir örnek ile sorunu yeniden mümkün olmamıştır.

<?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();
?>

Bu kod yapıyor daha sonra çalıştırmak için bazı php kod ile bir dize inşa ediyor. Özellikle, üretilen kod "$ öncesi" + Değişken bir sayı adında bir değişkenin değerini yazdırmak olacaktır. Bu durumda, çıkış şudur:

 <?php  print( $pre1 ); ?>

Her şey bu kod ile iyi çalışır. Sorun çok daha büyük bir sınıfın bağlamında kullandığınız zaman, ben uzun zamandır kullanıyorum bir çerçevenin parçası olduğunu. Burada sınıfın bütün kaynağını yapıştırmak değil, ancak sorunlu çizgiler (I str_replace kaldırmak için onları biraz basitleştirilmiş, ancak hata hala görünür) aşağıdaki gibidir:

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

Ben dosyayı yüklediğinizde, ben şu iki mesaj olsun:

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

Ben '\' kaldırarak uyarı düzeltmek, ancak bu kodun semantik, bu yüzden gerçek bir olasılık değil.

Now, the weirdest part is I can remove both errors by breaking or removing the sequence "

Bu sürüm bir fark gibi görünüyor, ama ben değişim günlükleri kendisine herhangi bir söz bulmak mümkün olmamıştır.


Şimdi Cryo bir çalışma çözümü var: dize bölmek

 "<?php" 

onun 'değerlendirme aşamasında' (gerçekten bir değerlendirme eğer ben emin değilim) önlemek için.

Yine de, ben yine de bu garip davranışın nedenini bilmek istiyorum.

Cryo: birkaç gün içinde cevap olarak yardımınız için teşekkürler, ben soru işareti olacak.

2 Cevap

Benim tahminim <?php, yarma deneyin PHP php etiketinin yeniden açılması alıcı olduğunu sadece:

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

Veya tek tırnak ve birleştirme kullanın:

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

Ben gerçek sorunu PHP çift tırnakla içindeki değişkenleri değerlendirir olduğunu düşünüyorum ama Cryo, doğru yolda olduğunu. Ancak, çizgi değerlendirilen gelen değişkeni engellemelidir. Yani:

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

Ben senin dize \ + $ myVar garip bir şekilde değerlendirildiğinde böyle bir garip bir şekilde değerlendirilir oluyor düşünüyorum.