<?php 
class DBAccess {
  private static $me = null;
  public static function getInst() {
    if ( is_null(self::$me) ) {
      echo "create a new object";
      self::$me = new DBAccess;
      // do some connection work
    } else {
      echo "retrive a old one";
    }
    return self::$me;      
  }
}$a = DBAccess::getInst();
?>每一次访问这个页面都是返回“create a new object”,如果想要让它返回"retrive a old one"应该怎么做呢?

解决方案 »

  1.   

    to zhoupuyue:
    我已经做过判断了
    to cenzige
    我每次刷页面  http://localhost/test.php
    都会打印“create a new object”
    所以 is_null(self::$me) 这句返回是true
      

  2.   

    Singleton.php:<?php
    class Singleton
    {
        private static $instance;    private function __construct()
        {
        }    public static function getInstance()
        {
            if(self::$instance == null)
            {
                self::$instance = new Singleton();
            }        return self::$instance;
        }
    }
    ?> 
      

  3.   

    $a = DBAccess::getInst(); 
    $b = DBAccess::getInst(); 第二次执行就会显示“retrive a old one”了.
    分析:
    因为“private static $me = null; ”,$me是静态的,每次执行后会存储它的值,所以只要执行第二次或更多时,$me便不是null,也便会显示你想要的结果了
      

  4.   

    to blueforyou:
    我希望用多个客户端访问这同一个页面,来让他返回“retrive a old one”
    请问是否有方法?
      

  5.   

    你用多个客户端试试吧,以前做过连接数据库的这类静态方法,如果把数据库的连接id设为静态的,它会是一直存在的,所以你这样写第一个客户端访问,第二个也应该是“retrive a old one”,个人浅见,试试看看,记得把结果公布一下。
      

  6.   

    看来...不会是这样子,都会是create a new object~~
      

  7.   

    我觉得大家都想偏了,其实这个原因很简单
    static变量只是在当前脚本下有效,所以当你访问一次(刷新一次浏览器)的时候之前的static已经失效了,$me的值在每次访问的时候值都是 null 所以会有这种结果你可以在一次脚本中再创建个变量测试一下就知道了
    class DBAccess { 
      private static $me = null; 
      public static function getInst() { 
        if ( is_null(self::$me) ) { 
          echo "create a new object"; 
          self::$me = new DBAccess; 
          // do some connection work 
        } else { 
          echo "retrive a old one"; 
        } 
        return self::$me;      
      } 

     
    $b = DBAccess::getInst();
    $c = DBAccess::getInst();
      

  8.   

    |  to blueforyou:
    |  我希望用多个客户端访问这同一个页面,来让他返回“retrive a old one”
    |  请问是否有方法?
      

  9.   

    每个页面都是一个独立的进程,结束后内存就释放了。你想返回retrive a old one可以,使用session来实现跨页。需要注意的是DBAccess如果是一个数据库连接,跨页后是虽然不是null,但也是无效的。<?php 
    session_start();class DBAccess { 
      private static $me = null; 
      public static function getInst() { 
        self::$me=unserialize($_SESSION['me']);
        if ( is_null(self::$me) ) { 
          echo "create a new object"; 
          self::$me = new DBAccess; 
          $_SESSION['me']=serialize(self::$me);
          // do some connection work 
        } else { 
          echo "retrive a old one"; 
        } 
        return self::$me;      
      } 
    } $a = DBAccess::getInst(); 
    ?>
      

  10.   

    页面终止,当前的对象,变量等都被销毁.
    如果想保存非resource类的对象或者变量,可以用序列化以后存到session或者数据库或者文件里.
      

  11.   

    恩,跨页的问题还是要session来解决