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

來源:互聯網
上載者:User
php require函數遇到文本就會輸出嗎?
這是我寫的模板類:
/** * 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:{$realPath} Not Found");        }    }}

回複內容:

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

/** * 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:{$realPath} Not Found");        }    }}

  1. require不是函數

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

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

require會把引用的檔案當做PHP檔案執行,不管是什麼尾碼名的檔案(沒有尾碼名都可以),有的PHP木馬利用這點來繞過防火牆。
PHP代碼需要放在 ?>之間才會執行。

蟹妖.

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

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

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.