-1

いくつかのコアシステムでメソッドチェーンを使用しています。これらのシステムの一部をモジュールから離れた場所に名前空間化しようとしています。ただし、チェーンを使用して名前空間を解決するのに問題があります。

したがって、これは(通常どおり)機能しますが、次のようになります。

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

一方、これは:

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

エラーをスローします:

Parse error: syntax error, unexpected T_NS_SEPARATOR

これを回避する方法はありますか?

私はほとんどすでにこれがノーゴーだと思っています。しかし、私が何かを見逃していないことを確認するように頼みます。

あなたの視点(間違いなく私のもの)によっては、それはバグです。

4

2 に答える 2

1

名前空間の解決は、メソッド自体のプロパティとしてではなくメソッド内で発生する可能性があります。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です。CoreUser_Friends()

編集私はあなたがドキュメントと「基本」の記事 をもう一度見ることをお勧めします。

編集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];
    }
}
于 2011-08-30T19:05:44.537 に答える
0

これには意味がありません。GLOBALS['model']はオブジェクトであり(を使用してそのメンバーにアクセスしているため->)、オブジェクトメンバーは名前空間を付けることができません(特定のクラス/オブジェクトに属しているため)。

は存在しないメソッドを魔法のように呼び出すために使用_call()しているので、たとえばのようにnaving規則を想定$GLOBALS['model']->Core_User()->User_Friends()->getAll();し、__call()代わり_\

于 2011-08-30T19:08:45.740 に答える