让我们说我存储了一个名为$_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"]
的可读性。
这里有最好的做法,还是真的没关系?
答案 0 :(得分:7)
$_SESSION
是一个特殊的PHP超全局数组。所以你在技术上可以随时使用它来引用它:
$_SESSION['logged_in_user']
然而,它也很特别,因为它可以改变。以下示例使其可见:
$alias =& $_SESSION;
session_start();
$alias['foo'] = 'bar';
此代码不会设置$_SESSION['foo']
。 $alias
指向之前的$_SESSION
,session_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"]
保持简单; &安培;不要添加头以为相同的变量创建新房间。