PHP如何跟踪创建的对象?

PHP如何跟踪创建的对象?,php,oop,Php,Oop,这可能是一个有点愚蠢的问题,但我不是一个OOP背景的人,尽管我边读边学,但我仍在为一些概念而挣扎 现在我正在使用PHP5.3,并使用几个不同的对象类设计一个相当简单的登录:User,它定义了用户。启动和维护会话数据的会话(如果有人登录),以及执行查询的数据库 所以当我的脚本运行时,我的会话对象被实例化,等等。。。这是我的问题。当我从一页移动到下一页时,该对象是如何跟踪的?或者更确切地说,我的问题是PHP如何知道与我的登录相关的对象是我的,而不是登录到该站点的其他人 我知道如果我是以非面向对象的方

这可能是一个有点愚蠢的问题,但我不是一个OOP背景的人,尽管我边读边学,但我仍在为一些概念而挣扎

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

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

我知道如果我是以非面向对象的方式来做这件事,我只需检查每一页上的会话cookie,并以这种方式检查我的数据,这很好,我的大脑可以处理。但是,在哪里以及如何跟踪对象数据

例如: 在每个页面上,我想检查是否有人登录I reference$session->is_logged_in()etc is_logged_in()检查私有变量名是否为true。 在这一点上没有检查cookies,这意味着这个对象仍然存在,并且,当它不断请求存储的变量时,实例必须保持有用。。。但是服务器PHP如何将该对象的实例与该用户联系起来呢?如果所有这些对象都在服务器上浮动,直到我销毁它们,对象不会占用很多内存吗

正如我在开始时所说,这可能是一个非常基本的基本问题,但我还没有对这一点有任何了解,我可能会回到更简单的PHP。

会话数据(即$\u会话中的所有数据)默认情况下是序列化的,并在请求之间存储到文件中。调用session_start()时,数据将自动取消序列化

从(我的)重点:

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

请求之间的内存中不会保留任何内容。PHP有一个不共享的体系结构,这意味着所有对象都会在每个请求上重新创建,除非您使用专用的缓存机制

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

启动会话时,会生成一个id。所有会话数据都与该id关联,并提供给浏览器以存储在cookie中。后续请求将该id包含在cookie中,PHP从何处提取数据

如果所有这些对象都在服务器上浮动,直到我销毁它们,对象不会占用很多内存吗


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

我发现,有时,当我开始对真正“发生的事情”失去了解时,可以快速浏览带有
phpinfo()的页面,或者只是记录一些环境变量通常会清除一些问题,并使我回到正轨上

Globals让你准确地看到你的环境中“存在”着什么,并让你对你“工作”中的东西进行精神上的补充,以及如何最好地应对挑战。。你会发现大量信息,至于你的具体“问题”,有如下条目

$\u服务器[“HTTP\u COOKIE”]

$\u服务器[“查询字符串”]

$\u服务器[“argv | c”]

$include\u路径

等等


另外,一次一次地阅读你的
/etc/php.ini
(无论在什么情况下)和php的内部结构都不会有什么坏处,这是为了提醒你“这是怎么回事”。

谢谢Gordon,我想我的部分大脑仍然难以接受对象的角色。我回去检查代码以遵循其逻辑。我很欣赏会话的功能,但我忘记了我的_构造方法,它调用了另一个函数来检查会话是否已设置。因此,是的,该对象正在以一种不同的方式执行我在其他地方应该执行的操作,即从简单地加载include文件然后填充会话数据开始重新创建该对象。谢谢你让我仔细考虑我说的话,我现在对它有了更好的理解。