Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将方法提取到具有全局范围的模板中,类似于提取函数_Php_Templates_Extract - Fatal编程技术网

Php 将方法提取到具有全局范围的模板中,类似于提取函数

Php 将方法提取到具有全局范围的模板中,类似于提取函数,php,templates,extract,Php,Templates,Extract,我创建了我的微型框架。在加载模板的类中,我有一个名为$variable的属性。此属性存储可变变量数组,这些可变变量应在我的模板中可用 例如: $this->variable = array($key=>5, $data=>10); 接下来,我使用函数extract() 因此,现在在我的模板(test.html.php)中,我可以简单地访问传递的变量: test.html.php echo $key; $this->import(); 我还有一个名为import()的

我创建了我的微型框架。在加载模板的类中,我有一个名为$variable的属性。此属性存储可变变量数组,这些可变变量应在我的模板中可用

例如:

$this->variable = array($key=>5, $data=>10);
接下来,我使用函数extract()

因此,现在在我的模板(test.html.php)中,我可以简单地访问传递的变量:

test.html.php

echo $key;
$this->import();
我还有一个名为import()的方法。 在我的模板中,操作员$this可以访问此方法

test.html.php

echo $key;
$this->import();

有没有可能在模板中调用my function import(),而不使用运算符$this?

让模板实现magic方法

class Template {
    ......

    public function __invoke() {
        $this->import();
    }
}
设置名为
import
的变量,该变量等于
$this

$this->variable['import'] = $this;
提取变量时,名为
$import
的变量将可用,如果在模板中执行
$import()
,则应调用模板类的
\u invoke()
方法,该方法反过来调用该类的
import()
方法


如果可能的话,您应该尽量避免在模板中调用方法。你应该只处理变量。对
$import()
的一个小小的调用可能不是世界上最糟糕的事情,这取决于该方法正在做什么。

如果可以,请尽量避免使用extract()和全局范围

使用extract()时要小心。

extract()是一种非常动态的语言功能,它往往会与本地范围中已经存在的变量发生冲突。你必须用第二个来解决这个问题 参数,该参数控制新创建的变量

  • (EXTR_SKIP)包括不覆盖任何现有变量
  • (EXTR_,如果_存在)仅覆盖现有变量(因此您可以创建白名单)
  • (EXTR_PREFIX_ALL)或向变量添加前缀
extract()会导致开发人员混淆,因为项目中的新开发人员根本不了解变量的来源

,关于将其与HHVM一起使用,因为需要对作用域变量进行额外的簿记。简而言之:在HHVM上优化速度时,避免使用它


在视图对象中使用提取仍然是常见的做法,如下所示:

在视图对象中使用extract()

// View.php
class View {

    public $variables;

    function render($filename) {
        extract($this->variables);
        ob_start();
        $this->returned = include($this->dir . $this->filename);
        return ob_get_clean();
    }
}

// test.php
$view = new View;
$view->variables = array('test' => 'Hello World!');    
$template = __DIR__.'/test.tpl';

echo $view->render($template);

// var_dump($view->returned); // to see included template content

// Template: test.tpl
<p><?php echo $test; ?></p>
foreach,通过键名创建动态全局变量

foreach($array as $var_name => $var_value)
{
   global $$var_name;
   $$var_name = $var_value;
}
或者更好(避免冲突)直接添加到全局数组

foreach($array as $var_name => $var_value)
{
   $GLOBALS[$var_name] = $var_value;
}

有效,但有害…

“如果可能的话,您应该尽量避免在模板中调用方法。”这将有助于创建干净的模板,但通常的做法是在模板中调用ViewHelper来对变量应用内容转换、翻译或格式化。这些操作应该在视图中完成,不是模板。然后,模板只处理视图创建的变量。