在没有直接插入的情况下,数据不会在多个 class 方法之间发送

Data not being sent between multiple class methods without direct insertion

我有一个class我正在开发它的方法相互调用并发送数据,

Class Template(){

   public variables = array('text' => 'test');

    public function loadTemplate( $filename ){           

        require PROJECT_PATH .DS. $filename;
    }

    public function render(){

       extract($this->variables);
       $this->loadTemplate('index.php');
    }

}

index.php 现在显示提取的变量

<html>
<body>
      <?php

      var_dump($text);

        ?>
</html>

但是现在不显示NULL值了!!但是当我直接要求它时,它起作用了,我做错了什么?

提前致谢。

简单的答案是您需要将 extract() 调用移动到实际发出 require 调用的函数中。

较长的答案是 extract() 将变量提取到当前函数的范围内。当您调用新函数以实际需要模板时,它有一个新的作用域。事实上,您只能访问 $filename 变量。

另外一点, 添加 EXTR_SKIP 作为 extract() 的第二个参数,这样它就不会覆盖文件名(因此变成一个安全漏洞):

function loadTemplate($filename) {
    extract($this->variables, EXTR_SKIP);
    require PROJECT_PATH .DS. $filename;
}

或者根本不将其存储在变量中:

function render() {
    extract($this->variables);
    require $this->findTemplatePath("index.php");
}

function findTemplatePath($template) {
    return PROJECT_PATH .DS. $filename;
}