现在我需要使用php,上次我使用它,它是简单的程序脚本。 现在它支持OO,如果我在第X页中启动对象,那么简单的Web行为如何
答案 0 :(得分:3)
在页面请求之间保留数据的唯一方法是使用sessions(或cookie)。您创建的任何对象以及您对静态类变量(或通常调用的字段)所做的任何更改都将丢失。
您可能需要做的是将一些信息存储为会话数据(使用$_SESSION
超全局;请参阅上面的链接)并使用它在每个请求开始时初始化对象和静态字段。
这可以通过一个单独的PHP文件轻松完成,该文件可以为您处理所有初始化。例如,如果要保留类型为Foo
的对象,则可以在所有脚本的开头包含此内容:
<?php
session_start();
// Get some session data that you've previously set.
if (isset($_SESSION['foo']))
{
$foo = $_SESSION['foo'];
}
else
{
// Hasn't been initialized, so do so now.
$foo = new Foo();
$_SESSION['foo'] = $foo;
}
?>
但是,我要注意以这种方式在会话数据中存储对象,因为它与HTTP协议的无状态相对立。最好在会话中存储最少的信息,从中可以重建应用程序的状态。例如,您可能只存储当前登录用户的ID,而不是整个对象,然后在每个请求上从该ID重新初始化它。如评论中所述,您希望以这种方式保留的任何对象也必须实现__sleep
and __wakeup
方法。
也许值得阅读关于this question的一些讨论。
答案 1 :(得分:1)
答案 2 :(得分:0)
是的,每次请求都会重新创建对象。一个PHP脚本,即使是面向对象的脚本也不知道任何先前的请求,并且在每次请求时都会解析和创建所有变量/对象(地狱甚至函数和类)。
现在这取决于第X页和第Y页的含义: 假设X和Y是php文件,在某种程度上都是在同一个请求中执行的,那么当然答案是肯定的。 另一方面,如果它们表示不同的请求,那么不,因为页面Y不知道是否发生了对页面X的请求,更不用说已经或者没有执行的代码的性质。
答案 3 :(得分:0)
PHP的基本特性没有改变 - 您仍然可以使用每个HTTP请求启动一个新的PHP程序,因此需要在每次加载页面时重新实例化对象。
但是,通过在$_SESSION
中存储对象的序列化副本,然后在后续页面加载时从序列化副本加载它,可以避免重建和重新加载数据的一些开销。 / p>