代码之家  ›  专栏  ›  技术社区  ›  Christian

PHP OO取消构造

  •  1
  • Christian  · 技术社区  · 16 年前

    所以我想问有没有更好的办法。

    我想做的是让一个对象构造函数返回其他的东西,而不是一个新的实例。

    $GLOBALS['object_cache']=array();
    
    class Test {
        public function __construct($id=0){
            if(isset( $GLOBALS['object_cache'][$id] ))
                return $GLOBALS['object_cache'][$id];
            $GLOBALS['object_cache'][$id]=$this;
        }
    }
    
    $t0=new Test(0);
    $t1=new Test(1);
    $t01=new Test(0);
    // modifying $t01 would presumably also modify $t0
    

    简单的(但丑陋的?)修复:

    $GLOBALS['object_cache']=array();
    
    class Test {
        public static function create($id=0){
            if(isset( $GLOBALS['object_cache'][$id] ))
                return $GLOBALS['object_cache'][$id];
            $new=new Test();
            $GLOBALS['object_cache'][$id]=$new;
            return $new;
        }
    }
    
    $t0=Test::create(0);
    $t1=Test::create(1);
    $t01=Test::create(0);
    // modifying $t01 would presumably also modify $t0
    

    你们觉得呢?顺便说一下,示例1不起作用;它返回一个新实例,而不管返回语句是什么。

    所以我是不是漏掉了什么,还是第二个更好?

    注:无需说明明显的关于模式(工厂/单例)。。。

    3 回复  |  直到 16 年前
        1
  •  2
  •   mario    16 年前

    您还可以使用过程版本:

    class Test {
        function __construct($i) {}
    }
    function Test($i) {
        static $cache;
        if (isset($cache[$i])) {
            return $cache[$i];
        }
        else { 
            return $cache[$i] = new Test($i);
        }
    }
    

    它对眼睛稍微好一点,能让人瞬间流畅 Test(1)->do()->else() 电话。

        2
  •  4
  •   zerkms    16 年前
    1. 它被称为工厂方法模式 http://en.wikipedia.org/wiki/Factory_method_pattern 实例化对象是一种常见的做法。

    static 类变量和第二个解决方案不会像现在这样奇怪。

        3
  •  1
  •   Emil Vikström    16 年前

    基本上你要做的是 Singleton pattern Factory method pattern . 如果您在技术文档(和注释)中记录它,那么任何人都应该能够知道它是如何工作的,因此可以使用第一种方法。

    第二个解决方案似乎 对我来说很明显。