为什么我在呈现新页面时无法访问 php 变量

why do I lose access to php variables when I render a new page

我的渲染函数看起来像:

function render($template, $values = array()){

   // if template exists, render it
   if (file_exists("../views/$template")){

      // extract variables into local scope
      extract($values);

      // render header_form
      require("../views/header_form.php");

      // render template
      require("../views/$template");

      // render footer
      require("../views/footer_form.php");

   }else{

      // else err
      trigger_error("Invalid template: $template", E_USER_ERROR);

   }
}

假设我有一个如下所示的脚本 crew.php:

<?php

    require('../includes/config.php');
        $values=[];           

        $today = new DateTime();

        render('crew_form.php',$values);

?>

为什么我无法在 crew_form.php 访问 $today?例如,如果 crew_form.php 是:

<?php

    echo $today;
?>

当你使用 require 时,不就是将脚本添加到现有代码中吗?是因为函数 render() 的局部作用域吗?

PHP 有时也称为 'shared nothing'。在单个 HTTP 请求中,所有内容 都从头开始构建,请求完成后释放所有内存。

如果你想在请求之间传递信息,你需要一个存储机制,比如数据库。这是设计使然,PHP.

一直如此

您无权访问 $today,因为您超出范围。该变量是在函数外部定义的,在函数内部不可用 - render() 是一个函数。

您可以使用 use 关键字或滥用 global 指令来避免问题,但避免污染范围的更好方法是显式传递变量并使用 extract().

这正是您的代码使用 $values 尝试执行的操作。但是你需要把$today放在$values里面然后传给render():

$values['today'] = $today;

现在,一个名为$today的变量将在crew-form.php、中可用,但它甚至不会相同$today如果它将作为相同值的副本开始。你可以这样看得更清楚:

$values['today2'] = $today;

inside crew-form.php,$today2会存在,$today不会,因为后者“超出范围”。

render 退出时,对提取值的更改将丢失(您可以使用 EXTR_REFS,但这会增加复杂性)。

看来我的预感是对的。如果 $today 是在渲染函数中创建的,我们确实可以在 crew_form.php.

中打印出来