V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tanteng
V2EX  ›  PHP

关于 PHP 单例模式的疑问

  •  
  •   tanteng · 2015-10-26 11:37:12 +08:00 · 2411 次点击
    这是一个创建于 3347 天前的主题,其中的信息可能已经有所发展或是发生改变。

    PHP 实现单例模式的类大概如下:

    class TestInstance
    {
        public static $_instance = null;
        public static $_count=0;//用来计数实例化的次数
        protected function __Construct()
        {
            echo 'Instance,Instance,Instance..........';
            echo "<br>";
        }
    
        public static function getInstance()
        {
            if(isset(self::$_instance) && self::$_instance instanceof self){
                return self::$_instance;
            }else{
                self::$_count++;
                self::$_instance = new static();
                return self::$_instance;
            }
        }
    }
    

    在需要用的地方这样:

    $aa == TestInstance::getInstance();
    $bb == TestInstance::getInstance();
    $cc == TestInstance::getInstance();
    

    这样用肯定没错,我要问的是下面这种方式:

    首先定义一个普通的类和一个全局函数:

    //demo.class.php
    class Demo
    {
        public function __Construct()
        {
            //TODO
        }
    }
    
    //functions.php 全局函数
    function get_obj()
    {
        static $obj;
        if($obj){
            return $obk;
        }else{
            $obj = new Demo();
            return $obj;
        }
    }
    

    在用的地方使用这个 get_obj 函数获取类的实例:

    $aa = get_obj();
    $aa->xx();
    
    $bb = get_obj();
    $bb->xx()
    

    第二种方式,并没有定义一个实现单例模式的类,通过 get_obj 函数实例化类,返回一个静态变量的实例,每次通过函数调用,实际上也是初始化一次这个类,这不也是单例模式吗?这种方式有什么潜在的问题呢?

    6 条回复    2015-10-26 12:56:20 +08:00
    tanteng
        1
    tanteng  
    OP
       2015-10-26 11:49:24 +08:00
    更正:
    $aa = TestInstance::getInstance();
    $bb = TestInstance::getInstance();
    $cc = TestInstance::getInstance();
    ljmready
        2
    ljmready  
       2015-10-26 12:07:15 +08:00
    这样做吃相不好,封装到一个类里,比较优雅。。。吧。
    djyde
        3
    djyde  
       2015-10-26 12:12:40 +08:00
    心疼写 php 的
    wingoo
        4
    wingoo  
       2015-10-26 12:32:17 +08:00
    使用单例的意义是什么
    无非就是复用, 节约创建对象的成本

    这个搞清楚了, 那就清楚了
    当然你还要尽可能的搞的漂亮些, 考虑的全面些
    所以都可以啦, 看你自己的情况

    貌似说了一堆废话:)
    Zzzzzzzzz
        5
    Zzzzzzzzz  
       2015-10-26 12:42:58 +08:00
    团队协作时要是有人忘了是单例直接 new class, 第一种一运行就出错, 第二种可能要出了事才会发现, 早暴露比晚暴露好。

    php4 时代没方法的权限控制和真正的静态方法, 第二种方法有遗留代码会用, 但并不提倡。
    tanteng
        6
    tanteng  
    OP
       2015-10-26 12:56:20 +08:00
    @djyde 此言何意?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1302 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:36 · PVG 01:36 · LAX 09:36 · JFK 12:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.