代码之家  ›  专栏  ›  技术社区  ›  Dan Lugg mab

访问子对象的语法选择

  •  1
  • Dan Lugg mab  · 技术社区  · 14 年前

    //the Registry methods can chain, each returning a self reference
    $registry = Registry::getInstance()->register('myObject', new Object);
    
    //accessing a registered object method
    //in various possible ways
    Registry::getInstance()->myObject->method();        //1
    Registry::getInstance()->use('myObject')->method(); //2
    $registry('myObject')->method();                    //3
    
    • 第一个变体使用 __get() 魔术,保持流畅的语法。
    • 吸气剂 '方法 use() .
    • 第三次使用 __invoke() 魔法,有人建议,但我不太喜欢。

    use 每次都很麻烦)

    这和我的另一个问题有点关系,在 PHP closures and implicit global variable scope

    1 回复  |  直到 7 年前
        1
  •  1
  •   SimonSimCity    13 年前

    我个人的意见是结合使用你的第二和第三个代码示例。使用这两种方法(或者只使用第二个示例),您可以使用phpDoc来维护自动完成功能。

    <?php
    
    class Session {
        public function register() {
        }
    }
    
    /**
     * @property Session $session
     */
    class Registry {
        private $_classes = array();
    
        public function __set($key, $value) {
            $key = (string) $key;
            if ((null === $value) && isset($this->_classes[$key])) {
                unset($this->_classes[$key]);
            } elseif (null !== $value) {
                $this->_classes[$key] = $value;
            }
        }
    
        public function __get($key) {
            $key = (string) $key;
            if (isset($this->_classes[$key])) {
                return $this->_classes[$key];
            }
    
            switch ($key) {
                case 'session':
                    $this->_classes[$key] = new Session();
                    break;
            }
    
            return $this->_classes[$key];
        }
    }
    
    $registry = new Registry();
    $registry->session->register();
    

    如果我能告诉你为什么我的注册表类不遵循singleton模式。。。如果要运行单元测试,请避免使用singleton模式。请看这里: http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html