PHP: разрешение пространства имен в цепочках методов объекта - PullRequest
0 голосов
/ 30 августа 2011

Мы используем метод цепочки в нескольких наших основных системах.Мы пытаемся выделить некоторые из этих систем из наших модулей.Однако у меня возникают проблемы с получением любого разрешения пространства имен с цепочкой для работы.

Итак, пока это работает (как обычно):

$GLOBALS['model']->User()->User_Friends()->getAll();

это, с другой стороны:

$GLOBALS['model']->Core\User()->User_Friends()->getAll();

выдает ошибку:

Parse error: syntax error, unexpected T_NS_SEPARATOR

Есть ли способ обойти это?

Я почти уже предполагаю, что это не пойдет.Но просят убедиться, что я что-то не упускаю.

В зависимости от вашей точки зрения (определенно моей), это ошибка.

Ответы [ 2 ]

1 голос
/ 30 августа 2011

Разрешение пространства имен может происходить внутри метода User, а не как свойство из самого метода.

В коде:

class model {
  private $user = false;
  public function User () {
    if ($this->user == false)
       $this->user = new Core\User(); // <--- namespace use happens here
    return $this->user;
  }
}

Таким образом, возвращаемым методом User является класс User из пространства имен Core, частью которого является метод User_Friends().

EDIT Я предлагаю вам еще раз взглянуть на документы , а также на статью " Основы ".

РЕДАКТИРОВАТЬ 2 Использование __NAMESPACE__ чтобы определить, в каком пространстве имен работать, внутри перегруженного метода:

class model {
    private $objects = array();
    public function __call($name, $arguments=false) {
        $ns = __NAMESPACE__;
        if (strlen($ns) < 1)
            $ns = 'none';
        if (!isset($this->objects[$ns]))
            $this->objects[$ns] = array();
        if (!isset($this->objects[$ns][$name])) {
            $class_desc = (strlen($ns) > 0 ? __NAMESPACE__ . '\\' : ''). $name;
            $this->objects[$ns][$name] = new $class_desc($arguments);
        }
        return $this->objects[$ns][$name];
    }
}
0 голосов
/ 30 августа 2011

Это не имеет никакого смысла.GLOBALS['model'] - это объект (я полагаю, поскольку вы обращаетесь к его членам с помощью ->), и члены объекта не могут (и не должны быть) иметь пространство имен (поскольку они принадлежат определенному классу / объекту).

Поскольку вы используете _call() для магического вызова несуществующих методов, вам нужно принять соглашение о примитиве, например, $GLOBALS['model']->Core_User()->User_Friends()->getAll();, а затем в __call() заменить _ на \

...