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

时间:2014-08-30 15:05:42

标签: php templates extract

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

例如:

$this->variable = array($key=>5, $data=>10);

接下来,我使用function extract()

extract($this->variable);

所以,现在在我的模板(test.html.php)中,我可以轻松访问传递的变量:

test.html.php

echo $key;

我也有名为import()的方法。 在我的模板中,我可以通过运算符$ this

访问此方法

test.html.php

$this->import();

是否有可能在模板中调用我的函数import(),而不使用运算符$ this?

2 个答案:

答案 0 :(得分:0)

让您的模板实现__invoke()魔术方法。

class Template {
    ......

    public function __invoke() {
        $this->import();
    }
}

设置名为import的变量,该变量等于$this

$this->variable['import'] = $this;

当您提取变量时,名为$import的变量将可用,如果您在模板中执行$import(),则应调用模板类的__invoke()方法,该方法又调用该课程的import()方法。

尽管可能,您应该尽量避免在模板中调用方法。你应该只处理变量。在那里某处调用$import()可能不是世界上最糟糕的事情,这取决于该方法的作用。

答案 1 :(得分:0)

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

使用extract()

时要小心

extract()是一种非常动态的语言特性,它往往会导致与本地范围内已存在的变量发生冲突。你必须使用第二个来处理 参数,控制新创建的变量。

  • (EXTR_SKIP),包括不覆盖任何现有变量,
  • (EXTR_IF_EXISTS)仅覆盖现有变量(因此您可以创建白名单)
  • (EXTR_PREFIX_ALL)或为变量添加前缀

extract()会导致开发人员混淆,因为您的项目中的新开发人员根本没有掌握变量的来源。

extract() is also a performance killer,关于将它与HHVM一起使用,因为需要对scoped-variable进行额外的簿记,这需要完成。简而言之:在HHVM上优化速度时,请避免使用它。


在View对象中使用extract仍然是常见做法,如下所示:

在View对象中使用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>

如果你真的想污染全球范围:

将变量合并到$ GLOBALS

$GLOBALS += $vars;

function globalize($data) {  
  $GLOBALS += $data;
}

$vars = array('a' => 1, 'b' => 2);
globalize($vars);
echo $a; // prints 1

使用键名创建动态全局变量

foreach($array as $var_name => $var_value)
{
   global $$var_name;
   $$var_name = $var_value;
}

或更好(以避免冲突)直接添加到GLOBALS数组。

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

工作,但是很邪恶......