今プロPHP今日もがんばるぞー!おはようございます、今プロPHP第11回はじめますー。今回は、前回の続きです。前回の最後にちょこっと問題的なことを書きましたが、解りましたでしょうか。今回はその辺りを掘り下げてみようと思います。include文での処理を確認では、前回のソースコードを見てみましょう。上記コードは前回のコードの一部抜粋です。(前回のコード130行目~の部分)このコードの13行目からの処理がinclude文を使用した処理になります。前回問題として書いたのは、このinclude文を使用した場合にはinclude文の行を実行した時点で結果を出力してしまうということでした。eval側の処理のようにob_start関数を使ってキャッシュをしていないからです。キャッシュをしていないので、includeが実行されればそのまま出力してしまいます。include文の方でもデータのキャッシュを取りましょう。・1行目と7行目を追加しました。処理内容はinclude文と同じです。これで、前回の問題は解決します。問題が残っているのです。それはエラー時の処理です。evalの方はパースエラーが発生してもプログラムが止まることはないので、エラー処理を行って、必要であればそのまま処理を継続することができます。ところがincludeの方は処理が止まってしまいます。今プロPHP第7回参照というわけで、includeの場合、エラーで止まってしまうのは仕方が無いと考えて、「エラーが出る前にエラーを検知して処理を継続」させるプログラムを考えてみましょう。テンプレートファイルのチェックテンプレートファイルをincludeしてパースエラーが出るということは、タグの閉じ忘れということになります。それなら、テンプレートファイルをincludeする前に、テンプレートファイルの中身をチェックしてタグの閉じ忘れが無いか調べればいいということです。具体的にどのようなことをすればいいのかをリストにしてみましょう。ダブルクォート(”)やシングルクォート(’)の閉じ忘れをチェック括弧({、})の閉じ忘れをチェックこの2つだけで大丈夫でしょう。プログラムを作ってみます。false;}このコードではクォートの数と括弧の数を数えて、クォートの数が偶数(かならず対で使用するため)かどうか、括弧はちゃんと閉じられているかを調べています。順を追ってみていきましょう。変数の初期化を行っています。ここで使用する変数はクォートの数と括弧の数をカウントするのに使います。3行目token_get_all()関数を使用して、$code(ここにテンプレートファイルのデータが入っていると仮定して)をPHPトークンに分割します。分割することで、配列として括弧やクォートを収納できるので、その配列をforeach文でループさせて数を数えます。4行目switch文を使って分割したPHPトークンをチェックしていきます。5行目~8行目シングルクォートやダブルクォートがある場合、$quote変数の値を増やします。括弧がある場合、$braces変数の値を増やします。閉じ括弧がある場合、$braces変数の値を減らします。これにより、値が0になれば括弧は対で使用されているということになります。2でforeachの処理を抜けます。2についてはリンク先breakを参照してください。19行目~23行目if文で以下の場合$error変数にtrueを代入します。以上がパースエラーチェックの処理となります。次回はこの処理をテンプレートエンジンに組み込んでいきます。この処理自体はeval側の処理でも使えるので、共有の処理として使用してもいいですね。