2017-02-08 3 views
0

zu fangen Wenn ich den folgenden Code von der Kommandozeile versuchen, fängt sie die ParseError richtig:Wie ParseError in Yii2 mit PHP 7.1

<?php 

$command = "["; 

set_error_handler(function($errno, $errstr) { 
throw new Exception($errstr); 
}, E_ALL); 
try { 
    eval("\$command = $command;"); 
} catch (ParseError $e) { 
    echo 'Caught parse error: ', $e->getMessage(), "\n"; 
} catch (Exception $e) { 
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
} 

Die Ausgabe lautet:

$ php eval.php 
PHP ParseError: syntax error, unexpected ';', expecting ']' in /home/ntibor/tmp/eval.php(9) : eval()'d code on line 1 
PHP Stack trace: 
PHP 1. {main}() /home/ntibor/tmp/eval.php:0 
Caught parse error: syntax error, unexpected ';', expecting ']' 

Allerdings, wenn ich m einen sehr ähnlichen Code in Yii2 mit verfängt es nicht die ParseError:

set_error_handler(function($errno, $errstr) { 
     throw new \yii\base\Exception($errstr); 
    }, E_ALL); 
    try { 
     eval("\$config = $this->calculation_formula;"); 
    } catch (ParseError $e) { 
     restore_error_handler(); 
     return $e->getMessage(); 
    } catch (\yii\base\Exception $e) { 
     restore_error_handler(); 
     return $e->getMessage(); 
    } 
    restore_error_handler(); 

ich nichts in den Lieferantencode von Y gefunden haben ii2 bezüglich ParseError. Ich sehe keinen Unterschied zwischen der cli und apache2 php Konfiguration entweder in Bezug auf E_PARSE.

+0

[Wenn der Befehl "eval" wird, wird er zu '" \ [= [; "' PHP erwartet die enge eckige Klammer, d. H. '" \ [] = []; ". '\ $ config = $ this-> calculation_formula;" 'könnte etwas anderes sein als' "\ $ command = $ befehl;' –

+0

Das ist klar. Das Problem ist, dass der ParseError nicht abgefangen wird. Ich habe "[" verwendet, um zu feuern ein ParseError. –

Antwort

1

Wenn ich mich richtig erinnere, müssen Sie hinzufügen ‚\‘ zu ParseError Klassendeklaration innen fangen wie folgt aus:

catch (\ParseError $e) { 
    restore_error_handler(); 
    return $e->getMessage(); 
} 

Es scheint an den Loader Yii2 verwendet bezogen werden, die die Art und Weise Klassen von PHP beeinflusst sind geladen.