php - 看看这个类的实例化方式能否实现“单例模式”?
黄舟
黄舟 2017-04-10 16:11:57
[PHP讨论组]

比如我有一个类,类名是A(这个类本身不是实现单例模式的,看后面实例化这个类的方式):

class A(){
    public $str = '这是属性';
    public $str2 = '属性';
    private $str3 = '私有属性';
    
    public function __construct($a,$b,$c){
        //构造方法
    }
    
    public function func1(){
        //类的方法
    }
    
    public function func2(){
        //类的方法
    }
}

还有一个全局函数:

function getObj(){
    require PATH.'a.class.php';//引入上面定义的class A的文件
    static $instance;//定义静态变量
    if($instance){
        return $instance;
    }
    $instance = new A('1','2','3');
    return $instance;
}

然后我要在其他地方调用类A的实例,并且可能需要一次请求调用多次,通过getObj方法来得到这个类的实例,因为是返回的静态变量,其实在第一次创建这个类的实例后,后面调用都是直接用的这个静态变量的实例,并没有重新new一个新的实例,这种方式算不算单例模式??如果不算,主要是哪里不同会有什么隐患??十分感谢!

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(2)
天蓬老师

会报错的,而且这种写法很糟糕

大家讲道理

其实不算。原因如下:
1.假设是多线程的环境,多个线程同时进入会不会同时产生多个对象呢,所以需要你进行冗余处理。我不知道php是怎么做的,但是Java可以通过sync关键字来搞定同步。
2.你构造函数是公有的,假设别人在你的代码上二次开发,但他不知道你的这个getobj。他就会自己new一个。这样也会有问题。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号