ホームページ > バックエンド開発 > PHPチュートリアル > PHP フレームワークを構築し、テンプレート エンジン インスタンスを構築する

PHP フレームワークを構築し、テンプレート エンジン インスタンスを構築する

零下一度
リリース: 2023-03-10 17:06:02
オリジナル
1304 人が閲覧しました

自从来到新公司就一直很忙,最近这段时间终于稍微闲了一点,赶紧接着写这个系列,感觉再不写就烂尾了。

之前我们说到,拿到{{ $name }}这样一段内容时,我们只需要将它转化成<?php echo $name ?>这样,就可以识别了,输出相应的变量值。

那就要需要正则匹配{{ $name }},然后替换掉{{}},分别替换成<?php echo?>

但是要想到一个问题,如果我在 view 里写了 php 的代码,其中含有{{ $name }},也会被替换。例子如下:

<?php$name = &#39;test&#39;;$str = "{{ $name }}";?>
ログイン後にコピー

要解决这个问题,我们需要将 PHP 的代码去掉,只留下 html 代码再做替换的处理。幸好 PHP 有一个方法 token_get_all,会将提供的内容按 PHP 标记进行分割。使用此方法解析如下内容:

$content = <<<VIEW<?php\$name = &#39;test&#39;;\$str = "{{ \$name }}";?><html>  <body>{{ \$name }}</body><html>VIEW;print_r(token_get_all($content));
ログイン後にコピー

这里$符号前加\是为了转移,在真正是现实不需要。结果如下:

Array
(
    [0] => Array
        (
            [0] => 379
            [1] => <?php
            [2] => 1
        )
    [1] => Array
        (
            [0] => 382
            [1] =>
            [2] => 2
        )
    [2] => =
    [3] => Array
        (
            [0] => 382
            [1] =>
            [2] => 2
        )
    [4] => Array
        (
            [0] => 323
            [1] => &#39;test&#39;
            [2] => 2
        )
    [5] => ;
    [6] => Array
        (
            [0] => 382
            [1] =>
            [2] => 2
        )
    [7] => =
    [8] => Array
        (
            [0] => 382
            [1] =>
            [2] => 3
        )
    [9] => "
    [10] => Array
        (
            [0] => 322
            [1] => {{
            [2] => 3
        )
    [11] => Array
        (
            [0] => 320
            [1] => $name
            [2] => 3
        )

    [12] => Array
        (
            [0] => 322
            [1] =>  }}
            [2] => 3
        )
    [13] => "
    [14] => ;
    [15] => Array
        (
            [0] => 382
            [1] =>
            [2] => 3
        )
    [16] => Array
        (
            [0] => 381
            [1] => ?>
            [2] => 4
        )
    [17] => Array
        (
            [0] => 321
            [1] =>
<html>
  <body>{{ $name }}</body>
<html>
            [2] => 5
        )

)
ログイン後にコピー

可以看到 PHP 相关的代码被解析了,我们只需要判断出是 html 代码,然后做替换就可以了。其中的321就是定义好的常量T_INLINE_HTML的值,标记解析出来的就是 html 代码。

我们定义view文件的后缀为sf,那我们就可以在controller/model/view目录下创建view.sf文件,内容如下

<?php$title = &#39;It is a title&#39;;$str = "{{ $title }}";?><html>
    <head>
        <title>{{ $title }}</title>
    <head>
    <body>
        <h2>{{ $str }}</h2>
        <p>{{ $body }}<p>
    </body>
</html>
ログイン後にコピー

然后我们来改造Controller中的render方法,代码如下

public function render($view, $params = [])
{
    $file = &#39;../views/&#39; . $view . &#39;.sf&#39;;
    $fileContent = file_get_contents($file);
    $result = &#39;&#39;;
    foreach (token_get_all($fileContent) as $token) {
        if (is_array($token)) {
            list($id, $content) = $token;
            if ($id == T_INLINE_HTML) {
                $content = preg_replace(&#39;/{{(.*)}}/&#39;, &#39;<?php echo $1 ?>&#39;, $content);
            }
            $result .= $content;
        } else {
            $result .= $token;
        }
    }
    $generatedFile = &#39;../runtime/cache/&#39; . md5($file);
    file_put_contents($generatedFile, $result);
    extract($params);
    require_once $generatedFile;
}
ログイン後にコピー

修改actionView如下

public function actionView(){$this->render(&#39;site/view&#39;, [&#39;body&#39; => &#39;Test body information&#39;]);}
ログイン後にコピー

访问 http://localhost/simple-framework/public/index.php?r=site/view ,得到如下页面
PHP フレームワークを構築し、テンプレート エンジン インスタンスを構築する

今天就先到这里。项目内容和博客内容也都会放到Github上,欢迎大家提建议。

code:

blog project:

以上がPHP フレームワークを構築し、テンプレート エンジン インスタンスを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート