2010-03-09 82 views
3

这可能有点愚蠢的问题,但我不是来自面向对象的背景,虽然我正在阅读和学习,我仍然在努力与一些概念。PHP如何跟踪创建的对象?

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

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

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

EG: 在每一页我想检查是否有人登录我参考$ session-> is_logged_in()等is_logged_in检查一个私人变量名是真或假。 这里没有检查cookie,这意味着这个对象仍然存在,并且,当它不断询问一个存储的变量时,实例必须坚持有用......但PHP,服务器,无论如何与那个实例绑定反对那个用户?如果所有这些对象都在服务器上浮动,直到我销毁它们,那么对象所使用的内存不会很多吗?

正如我刚开始说的那样,这可能是一个非常基本的基金问题,但我还没有找到我的灵感来源,我可能会回到更简单的PHP。

回答

5

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

PHP manual on Session Handling(重点煤矿):

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

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

+1

谢谢戈登,我想我的大脑的一部分仍然觉得很难接受对象的角色。我回去检查代码以遵循其逻辑。 我很欣赏会话会做什么,但我忘记了我的__construct方法,它调用另一个函数来检查我的会话是否设置。 所以是的,对象正在做我在其他地方做的事情,只是以不同的方式完成,也就是说,只需加载包含文件然后填充会话数据即可重新创建对象。 感谢您让我通过我所说的来思考,现在我对它有了更好的把握。 – TooManyCooks 2010-03-09 15:14:03

2

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

当你开始一个会话时,会产生一个id。所有会话数据都与该ID相关联,并将其发送给浏览器以存储在cookie中。随后的请求会在Cookie中包含该ID,并且PHP会将数据从it has stored it中抽出。

如果所有这些对象都在服务器上四处浮动,直到我摧毁它们,那么不会有很多对象使用的内存吗?

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

0

我发现有些时候,当我开始对什么是真的“正在发生”失去视野时,快速浏览一个带有phpinfo();的页面,或者只是记录一些ENV变量常常会清除所有东西,并让我回到正轨。

Globals让你看到你的环境中究竟是什么“存在”,并允许你对你正在“合作”的东西进行精神补充,以及如何最好地攻击挑战..你会发现财富的信息,并为您的具体“问题”有这样的条目...

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

等等

也,它绝不会伤害通过阅读你/etc/php.ini(何情况而定)的小单对一次性使用PHP的内部 - 提醒你“它是什么”。