0

PHP 用の (非常に) 基本的なテンプレート エンジンを作成しようとしています。私の調査に基づいて、私が使用している方法が非常に嫌われていることがわかりました. 同じ結果を得るための優れた代替手段を誰かが知っているかどうか疑問に思っていたので、私はそれを使用していません。そして、他の改善点があれば、共有してください!

アドバイスされていない方法はeval()方法です!

ここにphpファイルがあります

<?php

class Engine {
    private $vars = array();

public function assign($key, $value) {
    $this->vars[$key] = $value;
}

public function render($file_name) {
    $path = $file_name . '.html';

    if (file_exists($path)) {

        $content = file_get_contents($path);

        foreach ($this->vars as $key => $value) {
            $content = preg_replace('/\{' . $key . '\}/', $value, $content);
        }

        eval(' ?>' . $content . '<?php ');

    } else {
        exit('<h4>Engine Error</h4>');
    }
  }
}

?>

ここにindex.phpファイルがあります

<?php

include_once 'engine.php';

$engine = new Engine;

$engine->assign('username', 'Zach');
$engine->assign('age', 21);

$engine->render('test');

?>

これは、基本的な機能を表示するためのテスト用の html ファイルです。

My name is {username} and I am {age} years old!

出力:

My name is Zach and I am 21 years old!

よろしくお願いします!

4

1 に答える 1

-1

ページにテキストを出力するだけの場合は、次を使用しますecho

echo $content;

これは、いくつかの理由により優れています。たとえば、eval('?>' . $content . '<?php')誰かがユーザー名として を入力すると、そのコードは実行されません。<?php phpinfo(); ?>

ただし、他にも問題があることに注意してください。これを行うとどうなりますか?

$engine = new Engine;

$engine->assign('username', '{age}');
$engine->assign('age', 21);

$engine->render('test');

値の{age}usernameに置き換えられ21ます。通常、置換がそのように置換されることは望ましくありません。特に順序に依存するためです (username後で割り当てた場合は起こりません)。

于 2013-05-08T04:20:43.067 に答える