用于访问子对象的语法选择

时间:2010-10-31 02:56:40

标签: php syntax object static syntactic-sugar

我想知道哪个在语义上和技术上最适合我的选择。我已经创建了一个简单的对象注册表类,但是对象访问的方法让我想知道什么是最好的。我目前正在使用第一个版本:

//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()魔法,保持流利的语法。
  • 第二个使用' getter '方法use()
  • 第三个人使用了__invoke()魔法,这已被提出,但我不太喜欢。

我只是想知道是否有人有洞察力或建议使用任何(或没有)这些选项。在我的案例中使用Registry类的原因是提供关键对象的伪全球化,以便在嵌套闭包中使用(每次都用use声明它们很麻烦)

这与我在PHP closures and implicit global variable scope

的其他问题有些相关

提前致谢:)

1 个答案:

答案 0 :(得分:1)

我个人的意见是使用第二和第三代码示例的组合。使用两者(或仅使用第二个示例),您可以使用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();

如果我应该给你一个提示,为什么我的注册表类不遵循单例模式...如果你想运行单元测试,请避免使用单例模式。见这里:http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html