在PHP中引用会话变量

时间:2011-11-13 17:56:40

标签: php session

让我们说我存储了一个名为$_SESSION["logged_in_user"]的数组或对象。

如果我需要在整个脚本中反复引用它,以下哪项是最佳实践"?

  • 每次都使用$_SESSION["logged_in_user"](例如$_SESSION["logged_in_user"]["first_name"])?

  • 将对象复制到$logged_in = $_SESSION["logged_in_user"]这样的新变量中?

  • 创建对会话变量的引用,如$logged_in =& $_SESSION["logged_in_user"]

我可能会过度思考这个问题,但我主要担心的是脚本开销和可读性问题。我不确定重复引用会话变量是否比引用内联声明的变量慢。我也不知道是否将会话变量复制到"常规"变量增加了必要的开销。我确实感谢$logged_in["first_name"]$_SESSION["logged_in_user"]["first_name"]的可读性。

这里有最好的做法,还是真的没关系?

5 个答案:

答案 0 :(得分:7)

$_SESSION是一个特殊的PHP超全局数组。所以你在技术上可以随时使用它来引用它:

$_SESSION['logged_in_user']

然而,它也很特别,因为它可以改变。以下示例使其可见:

$alias =& $_SESSION;
session_start();
$alias['foo'] = 'bar';

此代码不会设置$_SESSION['foo']$alias指向之前的$_SESSIONsession_start()已创建新会话。

如果您知道这些警告,您可以自然地创建自己的$_SESSION抽象。

答案 1 :(得分:6)

你不是在思考它......思想是好的!

我个人使用symfony 1.4编写代码来解决这些问题,但你可以选择保持精益: - )

我认为OO(面向对象)。创建用户类。然后调用UserFactory :: getCurrentUser()或User :: getCurrentUser()之类的调用,它将返回当前登录的用户对象。该类的成员变量之一是user_id。但是,您将能够向该类添加附加功能和数据。

请记住,在OO中思考意味着使用非常接近问题域的抽象术语。用户,汽车,订单等。您不必具体,并且您不必在该类中包含所有可用信息,以使其“完整”,无论是什么。仅包含您当时需要的数据(请记住yagni)。这些课是对具体的现实世界的幻想。就像3D建模是现实世界的错觉一样。

希望有帮助...

答案 2 :(得分:1)

在我看来,你并没有过度思考。

但除非你有一些会话包装器/经理类,否则我只会使用:

$_SESSION['logged_in_user']
无论哪种方式,这都不是什么大不了的事。使用适用于的任何内容。

答案 3 :(得分:1)

您可以创建一个类来管理会话:

class MySession {

  public static &get( $key ){

    if( !array_key_exists( $key, $_SESSION ){
      return null;
    } 

    return $_SESSION[$key];

  }

}

这样您就不必担心如何检索值,也不会重复任何数据:

$first_name = MySession::get( 'first_name' );

注意:此解决方案涉及访问会话而不是您的具体实现:)

答案 4 :(得分:1)

$_SESSION["logged_in_user"]["first_name"]

保持简单; &安培;不要添加头以为相同的变量创建新房间。