我有很多PHP视图文件,我过去常常使用简单的include语句包含在我的控制器中。它们都使用在视图类中声明的方法,它们就像$ view-> method();但是我最近决定,如果包含也可以通过这个视图类来完成。但是,这会更改包含文件的范围,以便不再定义$ view。 这是一个代码示例:
in someViewFile.php (BOTH siuations)
<html>
<head><title><?php echo $view->getAppTitle(); ?></title>
etc.
OLD SITUATION in controller:
$view = new view;
include('someViewFile.php'); //$view is defined in someViewFile.php
NEW SITUATION in controller:
$view = new view;
$view->show('someViewFile'); //$view is not defined in someViewFile.php
现在,我在视图类中使用它来解决问题:
public function show($file){
$view = &$this;
include($file.".php");
}
是否有声明包含文件的范围或这是解决问题的最佳方法?
这些例子是粗略简化的。
答案 0 :(得分:12)
这是一个简化但功能强大的视图类,我已经看过很多并且使用了很多 正如您在下面的代码中看到的那样:使用模板文件的文件名实例化视图 客户端代码(可能是控制器)可以将数据发送到视图中。这些数据可以是您需要的任何类型的数据甚至其他视图 渲染父级时,将自动呈现嵌套视图 希望这会有所帮助。
// simple view class
class View {
protected $filename;
protected $data;
function __construct( $filename ) {
$this->filename = $filename;
}
function escape( $str ) {
return htmlspecialchars( $str ); //for example
}
function __get( $name ) {
if( isset( $this->data[$name] ) {
return $this->data[$name];
}
return false;
}
function __set( $name, $value ) {
$this->data[$name] = $value;
}
function render( $print = true ) {
ob_start();
include( $this->filename );
$rendered = ob_get_clean();
if( $print ) {
echo $rendered;
return;
}
return $rendered;
}
function __toString() {
return $this->render();
}
}
用法
// usage
$view = new View( 'template.phtml' );
$view->title = 'My Title';
$view->text = 'Some text';
$nav = new View( 'nav.phtml' );
$nav->links = array( 'http://www.google.com' => 'Google', 'http://www.yahoo.com' => 'Yahoo' );
$view->nav = $nav;
echo $view;
模板
//template.phtml
<html>
<head>
<title><?php echo $this->title ?></title>
</head>
<body>
<?php echo $this->nav ?>
<?php echo $this->escape( $this->text ) ?>
</body>
</html>
//nav.phtml
<?php foreach( $this->links as $url => $link ): ?>
<a href="<?php echo $url ?>"><?php echo $link ?></a>
<?php endforeach ?>
答案 1 :(得分:1)
你不能改变include()范围,不,所以你的方法可能与你描述的情况一样好。虽然我自己跳过了丑陋的PHP4-compat&符号。
答案 2 :(得分:1)
我做什么,(我不知道它有多好)只是
extract($GLOBALS);
include $view.".php";
当然可以运作
干杯!
答案 3 :(得分:1)
View类的更简化版本:
Class View {
protected $filename;
function __construct($filename){
$this->filename = $filename;
}
function display(){
global $session; //put global variables here
include Cfg::ROOT . '/views/' . $this->filename;
}
function assign($key, $val){
$this->$key = $val;
}
}
在控制器中:
$view = new View('homepage.php');
$view->assign('page_title',$page_title); //assign all needed variables from controller
$view->display();
在模板/视图文件中:
echo $this->page_title;
答案 4 :(得分:0)
也许这与我的php设置或其他东西有关,但是如果我在函数中包含一个文件,那个包含文件只会包含该函数变量的范围。
$a = 1; // This variable isn't visible for the included file
function render()
{
$b = 2; // This variable is
include('template.php');
}
// ----------------------------------------
// template.php
<html>
<body>
<?=$a?> // wont show
<?=$b?> // will show
</body>
</html>
我想我会选择这样的事情:
function render($template, $variables)
{
extract($variables);
include($template);
}
用法:
render('templates/mytemplate.php', array(a=>1, b=>2));
答案 5 :(得分:0)
扩展Quano提供的服务:
更进一步,在全局执行范围中包含变量(否则必须在include的内部使用global调用)。我们的想法是,您希望include能够像您的主应用程序范围或定义范围中一样工作。
考虑这个课程:
class PHPInclude {
private static $globalsList = array(
'GLOBALS','_SERVER','_GET','_POST','_FILES',
'_REQUEST','_SESSION','_ENV','_COOKIE'
);
public static function phpInclude($file,$variables=array()) {
if ( file_exists($file) ) {
$globs = array();
foreach ( $GLOBALS as $key => $value ) {
if ( !in_array($key,sefl::$globalsList) ) {
array_push($globs,$key);
}
}
foreach ( $globs as $key ) {
global $$key;
}
foreach ( $variables as $variable ) {
global $$variable;
}
unset($globs,$key,$value);
ob_start();
include $file;
return ob_get_clean();
}
return '';
}
}
按如下方式使用:
$foo = 'bar';
function testScope() {
$woo = 'sah';
PHPInclude::phpInclude('file.phtml',array($woo));
}
该示例将自动包含$foo
,因为它位于全局范围内,并且因为它位于本地范围内而添加$woo
。
我没有将$this
测试为任意变量,但我的蜘蛛感觉告诉我it won't work (warning)。
答案 6 :(得分:0)
我找到了一个很好的解决方案。只需创建一个匿名函数并调用它即可。仅适用于PHP 7+。
$arg1=1;
call_user_func(function()use($arg1,$arg2,...){
$values=$arg1+$arg2;
// $values is limited in scope inside this function
}
例如:
$values='HEY!';
//included code
$arg1=1;
$arg2=2;
call_user_func(function()use($arg1,$arg2,...){
$values=$arg1+$arg2;
// $values is limited in scope inside this function
}
echo $values;
// echos HEY!
答案 7 :(得分:-1)
您可以将get_defined_vars()作为参数发送到view函数。这将生成一个包含当前范围内所有已定义变量的数组。在你的&#34;视图&#34;方法,您将调用PHP&#34;&#34;提取&#34;在收到的阵列上。