evalを使って文字列を式として評価して実行したいと考えていますが、文字列がphpとして構文エラーにならないか、evalで実行する前に調べてから実行したいと考えているのですが、チェック用の関数などが見当たりません。
何か構文チェク用の関数があればお教えいただけますでしょうか。もしくは、それに変わる手法が何かあればお教えいただけますでしょうか。
以上、よろしくお願いいたします。
PECLが利用できれば、runkit_lint関数で構文チェックができます。
http://php.net/manual/ja/function.runkit-lint.php
素のままのPHPなら、以下のようにしてできます。
<?php $MyErrorNo = 0; function myErrorHandler($errno, $errmsg, $filename, $linenum, $vars) { global $MyErrorNo; $MyErrorNo = $errno; echo "$errmsg ($errno) occured."; } // $strを評価する // エラーがあればエラー番号を返す。エラーが無ければ0。 function my_lint($str) { global $MyErrorNo; set_error_handler('myErrorHandler'); error_reporting(E_ALL); @eval($str); restore_error_handler(); return $MyErrorNo; } //メインプログラム $str = '$x = 8 / 0;'; my_lint($str); ?>
eval ですいませんが。
<?php $r = @eval('invalid code') ; echo $r === FALSE ? 'パースエラー' : 'Ok.' ;
特にそれがユーザの入力を利用するようなものであればなおさら使うべきではないです。
が、諸事情で他の設計がやりづらく・・せめて文法チェックや入力値の型チェックを厳密にやって凌げるかどうか、検討をしているところです。
ご忠告ありがとうございます。