2011-01-16 11 views
13

phpDocでメソッドを「現在のクラスのインスタンスを返す」とマークするにはどうすればよいですか?

次の例では、IDE(Netbeans)ではsetSomethingが常にfooオブジェクトを返します。

しかし、オブジェクトを拡張すると、それは真実ではありません。$thisを返します.2番目の例では、fooオブジェクトではないbarオブジェクトです。

class foo { 
    protected $_value = null; 

    /** 
    * Set something 
    * 
    * @param string $value the value 
    * @return foo 
    */ 
    public function setSomething($value) { 
     $this->_value = $value; 
     return $this; 
    } 
} 

$foo = new foo(); 
$out = $foo->setSomething(); 

だから、罰金 - fooを返しsetSomething - しかし、次の例では、それはbarを返します..:

class bar extends foo { 
    public function someOtherMethod(){} 
} 

$bar = new bar(); 
$out = $bar->setSomething(); 
$out->someOtherMethod(); // <-- Here, Netbeans will think $out 
         // is a foo, so doesn't see this other 
         // method in $out's code-completion 

...私のためとして、これを解決するために素晴らしいことです、コード補完は大幅に高速化されます。

これをphpDocで文書化するには、誰かが賢明なやり方をしています。 (これらは単に回避されているクラスは設計されており、IDEの行動を訴えるために実装されてはならない)

オプション1: 方法someOtherMethodが抽象的または空作るここで

+2

PHPでは、アップキャストとダウンキャストの対象がないため、これはNetBeansの問題です。 – BoltClock

+0

これはおそらく答えに最も近いと思います(つまり、恐ろしい妥協なしにこれを行うことはできません)。私はJavaで、 'someOtherMethod'を使う前に' setSomething'の結果を 'bar'にアップキャストしなければならないと思います。 – ledneb

答えて

5

私はいくつか出会ったので、私はこのQを再訪したいと思います。

現在、「return $ this」はサポートされていませんが、PhpDocでv1にそれを正確に追加する要求があります。5:

http://pear.php.net/bugs/bug.php?id=16223

のEclipse PDTでそれに対する要求もあります:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=276082

はどちらも比較的古い要求です。私はすぐにこれが実装されていることに興奮するつもりはないが、ここでは期待している:)その間、この問題に対する適切な解決策はないようだ。

1

は約3作品ですFOOクラスのメソッド

class foo implements ifoo { 
    protected $_value = null; 

    /** 
    * Set something 
    * 
    * @param string $value the value 
    * @return ifoo 
    */ 
    public function setSomething($value) { 
     $this->_value = $value; 
     return $this; 
    } 

    // abstract method or create empty method if you want the method to be 
    // to be optional 
    abstract function someOtherMethod(); 
} 

オプション2:

オーバーライドメソッドSEバークラスのtSomething

class bar extends foo { 
    /** 
    * 
    * @param <type> $value 
    * @return bar 
    */ 
    public function setSomething($value) { 
     return parent::setSomething($value); 
    } 

    public function someOtherMethod(){} 
} 

オプション3: 使用インタフェース

interface ifoo { 
    public function someOtherMethod(){} 
} 

class foo { 
    protected $_value = null; 

    /** 
    * Set something 
    * 
    * @param string $value the value 
    * @return ifoo 
    */ 
    public function setSomething($value) { 
     $this->_value = $value; 
     return $this; 
    } 
} 

class bar extends foo implements ifoo { 

    public function someOtherMethod(){} 
} 
+0

オプション2は、ここではおそらく最善のアイデアですが、あなたが言うように、基本クラスが変更されたときに、拡張クラスを変更することになるすべての回避策です。私は真実は私が起こってほしいと思うのはNetbeans/phpDocの限界です。 phpDocが明示的に 'foo'を返すと言うので、Netbeansのせいだと言うのは難しいです。多分 '@return $ this'の文法はいくぶん良いでしょう。 :-S – ledneb

1

phpDoc syntax allows for multiple types to be defined by separating them with a | character for the @return tagclass fooclass barに拡張するときは、@returnの適切なクラスを持つ新しいphpDocタグを作成する必要があります。

関数がfooまたはbarのいずれかを返す場合は、@return foo|barを使用します。

しかし、あなたの場合は、オーバーライドされた機能のために@return barを定義するだけです。

注意してください。

+0

確かに、 'foo'のsetSomethingを' @return foo | bar | every-other-extends-class'として文書化することは望ましくありません。私はすべてのサブクラスのためにphpDocを書き直す必要を避けることを望んでいましたが、それがIDEに理解させる唯一の方法であるように見えます。 – ledneb

8

更新:Netbeansの7.4のよう

、IDEは、静的、@return自己をサポートしており、この(http://wiki.netbeans.org/NewAndNoteworthyNB74#Editor_2)。

class foo { 
    protected $_value = null; 

    /** 
    * Set something 
    * 
    * @param string $value the value 
    * @return this 
    */ 
    public function setSomething($value) { 
     $this->_value = $value; 
     return $this; 
    } 
} 

class bar extends foo { 
    public function someOtherMethod(){} 
} 

前の回答:

我々は、レコード反復子のcurrent()方法と同様の問題を持っています。イテレータは多くの異なるクラスに対して拡張されているため、@return $classが関連付けられていることは意味がありません。以前は@ satrun77のオプション2を使っていましたが、私は@methodを使ってNetbeansで成功しました。

class foo { 
    protected $_value = null; 

    /** 
    * Set something 
    * 
    * @param string $value the value 
    * @return foo 
    */ 
    public function setSomething($value) { 
     $this->_value = $value; 
     return $this; 
    } 
} 

/** 
* @method bar setSomething($value) 
*/ 
class bar extends foo { 
    public function someOtherMethod(){} 
} 
+0

幸いにも、よく知られているフォントレンダリングの問題のために7.4に向かって飛躍しなかった人にとって、この構文はNetbeans 7.3.1でも同様に機能します。 –

+0

戻り値として 'this []'のようなことをする方法はありますか? – tcigler

関連する問題