php框架 - php自己尝试写了模板引擎,最后display方法其实就是require一个html文件,为什么会输出呢?
程序员文章站
2022-03-19 16:58:26
...
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");
}
}
}
require
不是函数require
的功能是把后面的字符串作为文件名,不论文件扩展名是不是.php
,都认为那个文件是php程序,引入到当前程序中运行。php程序如果没有被
和
?>
包起来,就会直接输出。
require
会把引用的文件当做PHP文件执行,不管是什么后缀名的文件(没有后缀名都可以),有的PHP木马利用这点来绕过防火墙。
PHP代码需要放在和
?>
之间才会执行。
蟹妖.
当一个文件被包含时,语法解析器在目标文件的开头脱离 PHP 模式并进入 HTML 模式,到文件结尾处恢复。由于此原因,目标文件中需要作为 PHP 代码执行的任何代码都必须被包括在有效的 PHP 起始和结束标记之中。
include
或requrie
一个文件时, 文件中没有php起始标记和结束标记的位置都被当成html解析.