PHP 类范围

扫码查看

我对 PHP 相当陌生。在整个 PHP 应用程序中控制对类的访问的最佳方法是什么?存储这些需要在整个应用程序中访问的类的最佳位置在哪里?例子;我有一个在登录过程中创建的用户类,但每次页面发布时,对象都被重新初始化。

我试图设置属性 IsLoggedIn 然后每次在再次将对象创建为新对象之前检查该变量,但这似乎不起作用。我也试过在 PHP 中使用 isSet 函数查看类变量是否已经存在

最佳答案

你是对的,你的应用程序的状态不会从一个请求到另一个请求。

与桌面应用程序相反,Web 应用程序不会保持初始化状态,因为对于服务器来说,每次它都可能是另一个访问者,想要完全不同的东西。您知道谁在使用桌面应用程序,但不一定知道谁在请求页面。想象 10 个用户同时在您的 Web 应用程序上做不同的事情?您不必让每个访问者都运行整个应用程序。想象一下有 10,000 名访客......

不过,有一些方法可以从请求到请求保留一些数据。每次都会重新初始化应用程序,是的,但是您可以重新加载正在执行的操作的状态。它始终围绕相同的通用方法:

  • cookies ; Cookie 是保存在客户端的一个小文件,您可以在每次请求时获取其中的内容。在 PHP 中,这可以使用 $_COOKIE variable 获得。在所有情况下,您都可以 serialize 您的类实例并在之后重新加载它们。问题是,您不希望将敏感数据放在那里,因为任何(恶意)机构都可以看到并修改它。
  • POST 或 GET;在每个请求中,您在 $_GET request 中传递一个状态(例如 http://localhost/myscript.php?iamatstep=4 的 URL。或者通过 $_POST,例如在表单中使用隐藏的输入字段。这些数据可以被加密并且只对您有意义,但是,您仍然是将敏感数据放回客户端,任何人都可以摆弄它。
  • 数据库、磁盘;或者服务器上的其他任何东西。同样,您将数据序列化到文件中,例如在请求结束时准备好再次用于下一个请求。主要优点是它保留在您的服务器上。缺点是此时您不知道要为哪个请求提取哪些数据,因为您的应用程序可能同时有多个用户...

  • 这就是 $_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/

    10-11 03:38
    查看更多