gpt4 book ai didi

php - 如何使变量在模板中可用?

转载 作者:可可西里 更新时间:2023-11-01 12:52:42 26 4
gpt4 key购买 nike

我有以下类(class):

abstract class TheView
{
public $template = NULL;
public $variables = array();

public function set($name, $value)
{
$this->variables[$name] = $value;
}
public function display()
{
include($this->template);
}
}

模板文件是一个简单的 PHP 文件:

<?php
echo $Message;
?>

如何使 TheView::$variables 中的所有变量在模板中可用(每个项目的键应该是变量的名称)。

我已经尝试将所有变量添加到 $GLOBALS,但没有成功(我认为这是个坏主意)。

最佳答案

我总是这样做:

public function render($path, Array $data = array()){
return call_user_func(function() use($data){
extract($data, EXTR_SKIP);
ob_start();
include func_get_arg(0);
return ob_get_clean();
}, $path);
}

注意匿名函数和 func_get_arg() 调用;我使用它们来防止 $this 和其他变量“pollution”被传递到模板中。您也可以在包含之前取消设置 $data

如果您希望 $this 可用,只需直接从方法中使用 extract()include() 即可。

所以你可以:

$data = array('message' => 'hello world');
$html = $view->render('path/to/view.php', $data);

使用path/to/view.php:

<html>
<head></head>
<body>
<p><?php echo $message; ?></p>
</body>
</html>

如果您希望传递 View 对象,而不是从 render() 方法的范围内传递,请按如下方式更改它:

public function render($path, Array $data = array()){
return call_user_func(function($view) use($data){
extract($data, EXTR_SKIP);
ob_start();
include func_get_arg(1);
return ob_get_clean();
}, $this, $path);
}

$view 将是 View 对象的实例。它将在模板中可用,但只会公开公共(public)成员,因为它来自 render() 方法的范围之外(保留私有(private)/ protected 成员的封装 )

关于php - 如何使变量在模板中可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8376649/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com