回显会话变量可以按预期工作,但当';echo';则会发出未定义变量通知


Echoing a session variable works as expected, but when 'echo' is omitted, undefined variable notice is emitted

你好,我想取消这个例子。

当我有时

echo $_SESSION['lang'];

在输出中,正如我所期望的那样,我有"en"。

en-

但是:当我在同一行时,只写

$_SESSION['lang'];

我注意到,索引lang是未定义的。

注意:未定义的索引:lang。。。

请注意,我在Zend Framework上,只有当我设置Zend_Form_Hash元素时才会出现这种情况,该元素还设置了$_SESSION['__ZF']$_SESSION[' Zend_Form_Element_Hash_unique_token']值。

有人能解释这个案子吗?

如果它在同一个文件中,并且您只是交换了语句,那么$_SESSION['lang']echo $_SESSION['lang']绝对不可能访问任何不同的内容。

在发布实际答案之前,我们需要查看完整的代码和对您实际操作的解释。

如果你真的像我说的那样这样做,那不会有什么不同:

<?php
session_start();
echo $_SESSION['lang'];

然后更改第3行:

<?php
session_start();
$_SESSION['lang'];

虽然第二行不会输出任何内容,但肯定不会出现错误。

在您的第一条语句中,您将会话中的'lang'索引的值发送到输出。在第二条语句中,您只是访问会话中lang索引的值,而不执行任何特殊操作。两个语句都引用了相同的值。

所以问题不在于是否使用"echo"。问题在于:你确定会话中的"lang"索引在你的两次尝试中都可用吗?您是否在同一文件中使用这两个语句来响应同一请求?会话值在用户"上下文"中设置并可用。

var_dump($_SESSION)以了解$_SESSION 内部的确切内容

如果您使用ZF,那么您应该使用Zend_SessionNamespaces。你需要这样设置你的命名空间:

// setup namespace
$namespace = new Zend_Session_Namespace('locale');
// write values to your namespace with
$namespace->lang = 'en';
// read values from your namespace with
$language = $namespace->lang;

您还需要在早期阶段启动Zend_Session,例如在您的引导程序或具有以下的早期插件中

Zend_Session::start();

亲切问候Garry

在引导程序中.php

  1. 我开始自己的课程。这些值是从数据库中存储/恢复的。因此,我初始化了$_SESSION值。

  2. 然后我处理语言价值。简单设置。

$_SESSION['lang'] = 'en';

当我检查这个值时,它会像我预期的那样工作。问题是当我使用Zend_Form_Element_Hash时,它使用了"自己的"SESSION处理。我没有深入研究它,但我解释说,当我在类方法中回显SESSION时,我可以将其视为"lang"answers"en",但如果没有回显,代码将继续前进,Zend_Form_Element_Hash将重写整个会话,这就是为什么缺少"lang"的原因。

我只是实现了我自己的哈希令牌,然后继续。。。

感谢大家的帮助,并为不清楚的请求道歉。