关于面向对象PHP的几个问题

时间:2010-12-08 09:14:01

标签: php oop

现在我需要使用php,上次我使用它,它是简单的程序脚本。 现在它支持OO,如果我在第X页中启动对象,那么简单的Web行为如何

  1. 每次刷新页面X的同一用户是否会重新启动对象?
  2. 如果我在第X页的类Foo中启动对象,则在此对象中将值设置为静态变量。 我可以在页面Y中获取此变量值而不启动类Foo。只需用Foo :: staticVar获取它们。

4 个答案:

答案 0 :(得分:3)

  1. 不,如果是第Y页,则表示来自客户的单独请求。
  2. 在页面请求之间保留数据的唯一方法是使用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)

  1. 是的,静态var必须是公共的(非私有或受保护的)

答案 2 :(得分:0)

  1. 是的,每次请求都会重新创建对象。一个PHP脚本,即使是面向对象的脚本也不知道任何先前的请求,并且在每次请求时都会解析和创建所有变量/对象(地狱甚至函数和类)。

  2. 现在这取决于第X页和第Y页的含义: 假设X和Y是php文件,在某种程度上都是在同一个请求中执行的,那么当然答案是肯定的。 另一方面,如果它们表示不同的请求,那么不,因为页面Y不知道是否发生了对页面X的请求,更不用说已经或者没有执行的代码的性质。

答案 3 :(得分:0)

PHP的基本特性没有改变 - 您仍然可以使用每个HTTP请求启动一个新的PHP程序,因此需要在每次加载页面时重新实例化对象。

但是,通过在$_SESSION中存储对象的序列化副本,然后在后续页面加载时从序列化副本加载它,可以避免重建和重新加载数据的一些开销。 / p>