Выбор синтаксиса для доступа к дочерним объектам - PullRequest
1 голос
/ 31 октября 2010

Мне интересно, какой семантически и технически самый оптимальный из моих вариантов здесь.Я создал простой класс реестра объектов, но метод доступа к объектам заставляет меня задуматься, что лучше.В настоящее время я использую первый вариант:

//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 'method use().
  • Третий использует __invoke() магию, которая была предложена, но я не слишком люблю.

Я простоЛюбопытно узнать, есть ли у кого-нибудь понимание или предложения по использованию какого-либо (или ни одного) из этих вариантов.Причина использования класса Registry в моем случае состоит в том, чтобы обеспечить псевдоглобализацию ключевых объектов для использования во вложенных замыканиях (объявление их с помощью use каждый раз является громоздким)

Это в некоторой степени связано с другимвопрос, на закрытие PHP и неявная область видимости глобальной переменной

Заранее спасибо:)

1 Ответ

1 голос
/ 25 июля 2011

Мое личное мнение - использовать комбинацию вашего второго и третьего примера кода. Используя оба (или только ваш второй пример), вы можете использовать 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();

Если я дам вам подсказку, почему мой класс Registry не соответствует шаблону синглтона ... не используйте шаблон синглтона, если вы хотите запускать юнит-тесты. См. Здесь: http://sebastian -bergmann.de / archives / 882-Тестирование-Код-То-Использование-Singletons.html

...