首頁  >  文章  >  後端開發  >  php框架 - php自己嘗試寫了模板引擎,最後display方法其實就是require一個html文件,為什麼會輸出呢?

php框架 - php自己嘗試寫了模板引擎,最後display方法其實就是require一個html文件,為什麼會輸出呢?

WBOY
WBOY原創
2016-08-30 09:36:461121瀏覽

php require函數遇到文字就會輸出嗎?
這是我寫的模板類別:
<?php

<code>/**
 * User: 火蜥蜴制作
 */

namespace Core;

// 模板类
class Template
{
    private $data = [];
    private $path = ''; // 模板路径

    public function __construct() {
        $this->path = Config::get('project.template_path');
    }

    /**
     * 模板赋值
     * @param $key
     * @param $value
     */
    public function assign($key, $value) {
        if(is_array($key)) {
            $this->data = array_merge($this->data, $key);
        } else {
            $this->data[$key] = $value;
        }
    }

    /**
     * 获取路径
     * @param $file
     */
    private function getFilePath($file) {
        $params = explode('.', $file);
        // 模板路径已经加了分隔符
        $path = ROOT . DIRECTORY_SEPARATOR . $this->path;
        foreach ($params as $key => $param) {
            if($key == count($params) - 1) {
                $path .= $param;
            } else {
                $path .= $param . DIRECTORY_SEPARATOR;
            }
        }
        return $path . '.html';
    }


    public function display($file) {
        if(empty($file)) {
            throw new \Exception("Template Can Not Be Empty");
        }
        $realPath = $this->getFilePath($file);
        if(is_file($realPath)) {
            extract($this->data);
            require($realPath);
        } else {
            throw new \Exception("Template:<code>{$realPath}</code> Not Found");
        }
    }
}</code>

回覆內容:

php require函數遇到文字就會輸出嗎?
這是我寫的模板類別:
<?php

<code>/**
 * User: 火蜥蜴制作
 */

namespace Core;

// 模板类
class Template
{
    private $data = [];
    private $path = ''; // 模板路径

    public function __construct() {
        $this->path = Config::get('project.template_path');
    }

    /**
     * 模板赋值
     * @param $key
     * @param $value
     */
    public function assign($key, $value) {
        if(is_array($key)) {
            $this->data = array_merge($this->data, $key);
        } else {
            $this->data[$key] = $value;
        }
    }

    /**
     * 获取路径
     * @param $file
     */
    private function getFilePath($file) {
        $params = explode('.', $file);
        // 模板路径已经加了分隔符
        $path = ROOT . DIRECTORY_SEPARATOR . $this->path;
        foreach ($params as $key => $param) {
            if($key == count($params) - 1) {
                $path .= $param;
            } else {
                $path .= $param . DIRECTORY_SEPARATOR;
            }
        }
        return $path . '.html';
    }


    public function display($file) {
        if(empty($file)) {
            throw new \Exception("Template Can Not Be Empty");
        }
        $realPath = $this->getFilePath($file);
        if(is_file($realPath)) {
            extract($this->data);
            require($realPath);
        } else {
            throw new \Exception("Template:<code>{$realPath}</code> Not Found");
        }
    }
}</code>

  1. require不是函數

  2. require的功能是把後面的字串當作檔案名,無論檔案副檔名是不是.php,都認為那個檔案是php程序,引進到目前程式中運作。

  3. php程式如果沒有被<?php ?>包起來,就會直接輸出。

require會把引用的文件當做PHP文件執行,不管是什麼後綴名的文件(沒有後綴名都可以),有的PHP木馬利用這點來繞過防火牆。
PHP程式碼需要放在<?php ?>之間才會執行。

蟹妖.

當一個檔案被包含時,語法解析器在目標檔案的開頭脫離 PHP 模式並進入 HTML 模式,到檔案結尾處恢復。由於此原因,目標檔案中需要作為 PHP 程式碼執行的任何程式碼都必須被納入有效的 PHP 起始和結束標記之中。

includerequrie一個檔案時, 檔案中沒有php起始標記和結束標記<?php ?>的位置都被當成html解析.

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn