php - 为什么我在渲染新页面时无法访问 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() 的本地范围吗?
解决方案
您无权访问,$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,但这会增加复杂性)。