首页 > 解决方案 > 为什么我在渲染新页面时无法访问 php 变量

问题描述

我有一个看起来像这样的渲染函数:

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);

   }
}

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

<?php

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

        $today = new DateTime();

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

?>

为什么我无法访问 cramp_form.php 中的 $today?例如,如果 crowd_form.php 是:

<?php

    echo $today;
?>

当您使用 require 时,不只是将脚本添加到现有代码中吗?是因为函数 render() 的本地范围吗?

标签: phprequire

解决方案


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

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

这正是您的代码正在尝试做的事情,使用$values. 但是您需要放入$today并将$values其传递给render()

$values['today'] = $today;

$today现在, crew-form.php 中将提供一个名为的变量,$today即使它以相同值的副本开始,它也不会相同。你可以像这样更好地看到它:

$values['today2'] = $today;

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

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


推荐阅读