【问题标题】:class not retainining protected values类不保留受保护的值
【发布时间】:2013-06-20 03:16:10
【问题描述】:

我已经查看了我的问题的现有答案。

我已经在整个过程中回显了值,直到“header('Location”指令)值保持不变。

我不认为这是针对类似问题所建议的序列化问题...

以下是该类的相关位:

class clsSetUser {
  protected $UserID = 0;

  public function initUser($id) {
     // get user details from database

     $this->setUserID($id);
     // etc...
  }

  private function setUserID($value) { $this->UserID = $value; }
  public function getUserID() { return $this->UserID; }
}

common.php:

if(unset($clsUser)) $clsUser = new clsSetUser;

登录-exec.php:

$clsUser->initUser($id);   

header("Location: somewhere.php");

somewhere.php:

echo $clsUser->getUserID();

// here it equals 0

有什么想法吗? “标题”会序列化所有内容吗?

【问题讨论】:

    标签: php class serialization protected


    【解决方案1】:

    这是因为 PHP 实际上是在 somewhere.php 中从头开始。

    header("Location: somewhere.php"); 向浏览器发送命令以连接到不同的页面。在这个页面中,上一页的变量在 PHP 中是不可用的。

    你需要在$_SESSION中设置userId,这样当用户访问somewhere.php时,你可以从数据库中重新加载用户。

    登录-exec.php

    $clsUser->initUser($id);   
    $_SESSION['user_id'] = $id;
    header("Location: somewhere.php");
    

    somewhere.php

    $clsUser->initUser($_SESSION['user_id']);
    

    【讨论】:

    • Blast - 我曾希望避免过多地使用 $_SESSION。每次打开新页面时都不停地访问数据库是不合逻辑的。感谢您提供信息。
    • 为什么要避免访问数据库中的用户对象?如果用户/会话表被正确索引,那么获取用户对象将不会花费任何时间。否则,您可以尝试将所需的用户信息存储在 cookie 中,但随后该数据将在每次请求时传输到服务器。这可能会增加页面的加载时间。
    • 不只是用户对象,它是数据库对象,以及从不改变并且来自ini文件的各种值。这都是增加的处理时间,应该只执行一次。我有一个非常大的应用程序,有数百页。我曾希望构建一个完整的 OO 系统,但显然不是在 PHP 中,如果每次发出 header 指令时都销毁类,我无法做到这一点......
    • 不只是在使用header指令的时候。每当网站返回页面时。 PHP 是无状态的,他用户向服务器发送的每个请求,即用户单击的每个链接,都是一个全新的请求。我不确定您正在从事哪种项目,但如果您需要持久性,我不确定 PHP 是最简单的前进方式。也许这可以给出一个提示:stackoverflow.com/questions/2940610/…
    • 我现在不打算用其中一种 VB 语言 (ASP.NET) 或 Java 进行重新开发。开销太大了。我只需要使用 $_SESSION。
    猜你喜欢
    • 2011-06-06
    • 2015-04-23
    • 2010-09-30
    • 2010-11-04
    • 2016-02-19
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    相关资源
    最近更新 更多