为什么我在呈现新页面时无法访问 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.
中打印出来
我的渲染函数看起来像:
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.
中打印出来