我对 PHP 相当陌生。在整个 PHP 应用程序中控制对类的访问的最佳方法是什么?存储这些需要在整个应用程序中访问的类的最佳位置在哪里?例子;我有一个在登录过程中创建的用户类,但每次页面发布时,对象都被重新初始化。
我试图设置属性 IsLoggedIn 然后每次在再次将对象创建为新对象之前检查该变量,但这似乎不起作用。我也试过在 PHP 中使用 isSet 函数查看类变量是否已经存在
最佳答案
你是对的,你的应用程序的状态不会从一个请求到另一个请求。
与桌面应用程序相反,Web 应用程序不会保持初始化状态,因为对于服务器来说,每次它都可能是另一个访问者,想要完全不同的东西。您知道谁在使用桌面应用程序,但不一定知道谁在请求页面。想象 10 个用户同时在您的 Web 应用程序上做不同的事情?您不必让每个访问者都运行整个应用程序。想象一下有 10,000 名访客......
不过,有一些方法可以从请求到请求保留一些数据。每次都会重新初始化应用程序,是的,但是您可以重新加载正在执行的操作的状态。它始终围绕相同的通用方法:
这就是 $_SESSION 的概念发挥作用的地方。这只是同时使用所有这些的打包方式。它并不像初学者通常认为的那样神奇。当您使用 session 时,放入 $_SESSION 的数据存储在服务器上的某处(通常是临时目录中的文件,尽管它可以更改为其他内容,例如数据库)并且该 session 具有唯一 ID 并传递在一个 cookie 中,它将跟踪访问者的请求。因此,客户端唯一的事情就是 cookie 中的一个大数字。在下一个请求中,浏览器告诉服务器上的 PHP 它的 session 号为 12345,如果存在则加载相应的文件,然后您可以再次使用该数据。如果未启用 cookie,则可以在 GET 或 POST 中传递它,尽管通常最好不要去那里(请参阅 session.use_trans_sid's note )。
在您需要身份验证的每个页面上,通常看起来都是这样。
<?php
// verify if we have a current session
if (isset($_SESSION['login'])) {
// get data in current session
$username = $_SESSION['login']['username'];
$isLoggedIn = $_SESSION['login']['isLoggedIn'];
} else {
$username = '';
$isLoggedIn = false;
}
// take care of the unauthorized users
if (!$isLoggedIn) {
// maybe a redirection here...
}
// do the things a logged in users has the permission to do
要设置 session ,它可能看起来像这样:
<?php
// handle the form post of your login page for example
if (isset($_POST['username']) && isset($_POST['password'])) {
$username = $_POST['username'];
$password = $_POST['password'];
// verify the username and password against a database
if ($everythingIsOkay) {
// we can consider this user logged in and create a session
$_SESSION['login']['username'] = $username;
$_SESSION['login']['isLoggedIn'] = true;
// and now maybe redirect the user to the correct page
}
}
// raise an error about an invalid login
最后,也许一个 logout.php 页面会做这样的事情:
<?php
unset($_SESSION['login']);
// redirect the user to the login page
关于PHP 类范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/390575/