Rumah >pembangunan bahagian belakang >tutorial php >php框架 - php自己尝试写了模板引擎,最后display方法其实就是require一个html文件,为什么会输出呢?

php框架 - php自己尝试写了模板引擎,最后display方法其实就是require一个html文件,为什么会输出呢?

WBOY
WBOYasal
2016-08-30 09:36:461179semak imbas

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解析.

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:laravel5.3的几个问题Artikel seterusnya:winSCP怎么设置项目的权限?