PHP如何跟踪创建的对象?

时间:2010-03-09 13:42:12

标签: php oop

这可能是一个愚蠢的问题,但我不是来自OOP背景,虽然我正在阅读和学习,但我仍然在努力学习一些概念。

现在我正在使用PHP 5.3并使用几个不同的对象类设计一个相当简单的登录:定义用户的用户。会话,启动和维护会话数据,如果有人登录,以及执行查询的数据库。

因此,当我的脚本运行时,我的会话对象被实例化,等等......这是我的问题。当我从一个页面移动到下一个页面时,如何跟踪该对象?或者更确切地说,我的问题是PHP如何知道与我的登录相关的对象是我的,而不是登录该网站的其他人?

我知道如果我以非OOP方式执行此操作,我只需检查每个页面上的会话cookie并检查我的数据,这对我的大脑来说可以处理。但是,跟踪对象数据的位置和方式。

EG: 在每个页面上,我想检查是否有人登录我引用$ session-> is_logged_in()等is_logged_in检查私有变量名是true还是false。 此时没有检查cookie,这意味着该对象仍然存在,并且,因为它一直要求存储的变量,实例必须保持有用......但PHP,服务器如何与该对象的实例相关联那个用户?如果所有这些对象在服务器上浮动直到我销毁它们,那么对象不会使用大量内存吗?

正如我在开始时所说的那样,这可能是一个非常基本的基本问题,但我还没有得到我的时刻,我可能会回到更简单的PHP。

3 个答案:

答案 0 :(得分:5)

会话数据(即$ _SESSION中的所有数据)默认为序列化并存储在请求之间的文件中。调用session_start()时,数据会自动反序列化。

来自PHP manual on Session Handling(强调我的):

  

会话支持允许您注册要在请求之间保留的任意数量的变量。当访问者访问您的站点时,PHP将自动检查(如果session.auto_start设置为1)或您的请求(显式通过session_start()或通过session_register()隐式检查)是否已随请求发送特定会话ID。如果是这种情况,则先前保存的环境重新创建

请求之间的内存中没有任何内容。 PHP具有无共享体系结构,这意味着除非您使用专用缓存机制,否则将重新为每个请求重新创建所有对象。

答案 1 :(得分:2)

  

所以当我的脚本运行时,我的会话对象被实例化等等......这是我的问题   虽然。当我从一个页面移动到下一个页面时,如何跟踪该对象?或者更确切地说    我的问题是PHP如何知道与我的登录相关的对象是我的,而不是   登录该网站的其他人?

启动会话时,会生成一个ID。所有会话数据都与该ID相关联,并将其提供给浏览器以存储在cookie中。后续请求包括cookie中的id,PHP将数据从it has stored it

中提取出来
  

如果所有这些对象在服务器上浮动直到我销毁它们,那么对象是否会使用大量内存?

将对象序列化为文件而不是保存在RAM中,并在会话过期时进行清理。

答案 2 :(得分:0)

我发现,有时候,当我开始失去关于真正“发生”的观点时,快速访问带有phpinfo();的页面,或者只是记录一些ENV变量通常可以解决问题,并让我回头在轨道......

Globals让您可以准确地了解您环境中存在的“存在”,并让您对您正在“使用”的内容进行心理补充,以及如何最好地应对挑战。您将找到丰富的信息,以及您的具体“问题”,有这样的条目......

$_SERVER["HTTP_COOKIE"]
$_SERVER["QUERY_STRING"]
$_SERVER["argv | c"]
$include_path

等...

另外,通过PHP /etc/php.ini(在任何情况下都可以)通过PHP的内部细节一对一地阅读它,从来没有伤害过 - 提醒你“它的全部内容”。