Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.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
PHP类作用域_Php - Fatal编程技术网

PHP类作用域

PHP类作用域,php,Php,我对PHP相当陌生。在整个PHP应用程序中控制类访问的最佳方法是什么?在哪里存储这些需要在整个应用程序中访问的类是最好的?例子;我有一个在登录过程中在上创建的用户类,但每次页面发布时,似乎都会重新初始化该对象 我试图设置属性IsLoggedIn,然后在再次将对象创建为新对象之前检查该变量,但这似乎不起作用。我还尝试在PHP中使用isSet函数来查看类变量是否已经存在这种数据必须存储在会话中,从一页到另一页的唯一内容是会话数据(会话/cookies/…),因此不会进行类初始化 您可以通过以下方式将

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


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

这种数据必须存储在会话中,从一页到另一页的唯一内容是会话数据(会话/cookies/…),因此不会进行类初始化

您可以通过以下方式将用户用户名等信息添加到会话:

$username //username from db
$name //name from db
$_SESSION['username'] = $username;
$_SESSION['name'] = $name;
或者,如果您只想轻松访问有关用户的所有信息,可以执行以下操作:

$_SESSION['user'] = mysql_fetch_assoc($result); //where $result is the response from the db to your login query

完成此操作后,$\u会话['user']将成为一个数组,其中包含您从数据库中选择的所有详细信息。

没错,应用程序的状态不会从一个请求转移到另一个请求

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

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

  • 饼干;Cookie是一个保存在客户端的小文件,它的内容将在每次请求时提供给您。在PHP中,可以使用。在所有情况下,您都可以创建类实例,然后重新加载它们。问题是,您不希望将敏感数据放在那里,因为任何(恶意)实体都可以看到并修改它

  • 发布或获取;在每个请求中,您都会在(URL)中传递一个状态,例如。或通过一个,例如在表单中使用一个隐藏的输入字段。这些数据可能会被加密,并且只对您有意义,但您仍然会将敏感数据放回客户端,任何人都可以对其进行篡改

  • 数据库、磁盘或服务器上的任何其他内容。同样,您可以将数据序列化到文件中,例如在请求结束时,准备再次用于下一个请求。主要优点是它保留在服务器上。缺点是,此时,您不知道要为哪个请求提取哪些数据,因为可能存在多个同时删除应用程序上的所有用户

  • 这正是使用的概念发挥作用的地方。它只是一种同时使用所有这些功能的打包方式。这并不像初学者通常认为的那样神奇。当您使用会话时,放入$\u会话的数据存储在服务器上的某个位置(通常是临时目录中的文件,但可以将其更改为其他文件,如数据库)这个会话有一个唯一的ID,并传递到一个cookie中,cookie将跟踪访问者的请求。因此,客户端唯一的事情就是cookie中的一个大数字。在下一个请求中,浏览器告诉服务器上的PHP它的会话号是12345,如果存在,则加载相应的文件,然后数据是ava我再次向您发送。如果未启用Cookie,它可以通过GET或POST传递,但通常最好不要去那里(请参阅)

    通常情况下,在每个页面上都需要验证

    <?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
    
    
    
    <?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
    
    <?php
    
    unset($_SESSION['login']);
    // redirect the user to the login page