Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OOP php中使用$\u会话_Php_Oop_Session - Fatal编程技术网

在OOP php中使用$\u会话

在OOP php中使用$\u会话,php,oop,session,Php,Oop,Session,我需要重新设计一个网站的后端,需要一些帮助开始。原来的网站使用OOP,有一个类“User”用来保存用户登录时的数据。根据需要在每个页面上序列化和取消序列化: // login.php $user = new User($iduser); // ... // At the end of the script $_SESSION["user"] = serialize($user); // Another page $user = unserialize ($_SESSION["user"]);

我需要重新设计一个网站的后端,需要一些帮助开始。原来的网站使用OOP,有一个类“User”用来保存用户登录时的数据。根据需要在每个页面上序列化和取消序列化:

// login.php
$user = new User($iduser);
// ...
// At the end of the script
$_SESSION["user"] = serialize($user);

// Another page
$user = unserialize ($_SESSION["user"]);
因此,用户访问的每个页面上都可以使用这些数据。另外,(几乎)在访问的每个页面中,$_会话[“user”]都会用新数据进行更新(很可能page_a.php不使用page_b.php需要显示的数据)

新的设计应该完全面向对象。我发现的主要问题是,我不知道如何在类方法中正确存储$\u会话[“user”]

我尝试使用Codeigniter,但它在cookie中使用会话变量,这不是我需要的


任何建议或链接都会有所帮助。提前感谢。

我没有使用Codeigniter的经验,因此我无法给出任何具体建议。我相信,如果在这个框架中有任何特定的工具可用于这个用例,其他人会为您指出正确的方向。我可以给你一些见解,告诉你如何用基本的、普通的PHP来处理这个问题

如果你想让事情变得简单,我建议你使用某种应用程序singleton(或者Auth,或者你想叫它的任何东西),它可以像活动用户一样处理静态数据。考虑下面的(非常基本的和未经测试的)代码

这将允许您执行以下操作:

/* fetch the active user */
$user = App::getInstance()->user;

/* set the active user */
$app = App::getInstance();
$app->user = new User($iduser);
处理完应用程序对象后,析构函数处理程序负责将数据发送回会话。由于我们使用单例模式,所以无论从何处调用,都只能有一个实例。这确保您始终与同一用户交谈


如果有什么不清楚的地方,或者您希望我进一步解释,请告诉我。

PHP在使用
$\u会话时也会使用cookie。无论如何,您不能编写一个包装
$\u会话的类吗?调用本身不会是OOP,但您可以在类中隐藏所有非OOP调用(对其他函数也是如此)<代码>$\u会话
是一个超全局会话。所以你可以在任何你想写的地方写。不管它是在全局名称空间中的类方法还是函数中,我同意@arkaschaI的观点,因为它知道$\u会话可以在任何地方使用,但我不想在我的所有类中都使用它,这是一种非常糟糕的做法。如果php更改会话的工作方式或超全局的名称,会发生什么情况?我(或下一个程序员)将不得不更改代码中的许多行。是的!非常感谢,这正是我想要的。还有一个问题。我不想在这里使用单例模式,因为原始代码使用了多个会话变量(实际上是3,取决于访问的页面)。这段代码完全是一场灾难!我应该更改什么?嗯,如果看不到任何明显的代码,很难判断。我知道单例模式并不总是理想的,因为它引入了紧密耦合,使您的应用程序难以测试。依赖注入是一个明显的选择,但是我建议使用一个框架,而不是从头开始构建一切(我自己也是一个拉威尔迷)。按照我回答中的例子,为什么不在应用程序singleton中添加这两个额外的变量呢?Singleton意味着只能有一个应用程序实例,但应用程序类显然可以包含比该用户更多的应用程序实例…我将尝试添加两个额外的变量,如您所建议的,我认为这会起作用。再次非常感谢!
/* fetch the active user */
$user = App::getInstance()->user;

/* set the active user */
$app = App::getInstance();
$app->user = new User($iduser);