18

私が関数を持っているとしましょう(明らかに些細な例です):

public function dot(){
    return implode('.', func_get_args());
}

今、私はこれを次のように変更できることを知っています

public function dot(array $items){
    return implode('.', $array);
}

ただし、オプションではないいくつかの機能があります。では、関数の最初のバージョンを docBlock で文書化して、IDE が無制限のパラメーターを受け取ることができると解釈できるようにするにはどうすればよいでしょうか?

以下を使用するいくつかの方法を見てきました。

/**
 * Joins one or more strings together with a . (dot)
 * @param string $string1
 * @param string $string2
 * @param string $_ [optional]
 * @return string
 */
public function dot($string1, $string2, $_ = null) {
    return implode('.', func_get_args());
}

IDE では次のようになりますオートコンプリートの例

しかし、それは私にはハックのように感じます.docBlockだけでそれを行う方法はありませんか?

4

3 に答える 3

16

[2015-01-08 更新]

PHPDoc でこれを行う古い方法は次のとおりです。

http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.param.pkg.html

/**
 * @param int $param,...
 **/

ただし、これはサポートされなくなりました。PHP 5.6 の時点で Variadic Method Parameters は PHP 言語の一部であり、私の記憶が正しければ、PHPDoc は PHPDoc 2.4 の時点でこれを反映するように更新されています。これは、EAP 139.659 の時点で PhpStorm IDE にも含まれています (8.0.2 以降である必要があります)。他の IDE の実装については不明です。

https://youtrack.jetbrains.com/issue/WI-20157

いずれにせよ、可変引数パラメーターの今後の DocBlocks の適切な構文は次のとおりです。

/**
 * @param int ...$param
 **/
于 2014-06-20T22:42:45.257 に答える
11

Variadicsは PHP 5.6 で実装されているため、PHPDocumentor はバージョン 2.4で次の構文をサポートする必要があります。

/**
 * @param Type ...$value
 * Note: PHP 5.6+ syntax equal to func_get_args()
 */
public function abc(Type ...$value) {}

これは、そのような署名を説明する正しい方法です。これはPSR-5に含まれる可能性があります。それが受け入れられたら、IDE はこの「公式」の推奨事項をサポートするために従う必要があります。

ただし、それまでの間、一部の IDE は、自分たちが正しいと考えるものについての理解を深めています5.6 の時点でサポートされている公式の PHP 構文をサポートするように IDE ベンダーに強く働きかけるか、それまでの間は機能するものを使用してください。

于 2014-06-21T00:38:20.293 に答える
2

PHP では、valist または「オプションの引数」のリストの概念は存在しません。

変数には$_、ここで指定した 3 番目の文字列が含まれます。配列または文字列を許可する唯一の方法は、最初の引数を次のようにテストすることですis_array()

public function dot($arg1){
   if(is_array($arg1)){
       return implode('.',$arg1);
   }
   else if $arg1 instanceof \Traversable){
       return implode('.',iterator_to_array($arg1));
   }
   else{
       return implode('.',func_get_args());
   }
}

必要な動作を処理したので、それを文書化する必要があります。php では、オーバーロードが許可されていないため、複数の型を提供する場合は "mixed" を型として使用するのが慣例です。

/**
*@param mixed $arg1 an array, iterator that will be joined OR first string of the list
*@return string a string with all strings of the list joined with a point
*@example dot("1","2","3"); returns 1.2.3 dot(array(1,2,3)); returns 1.2.3
*/

さらに、phpdocumentorのドキュメントによると、一種のvalistを宣言できます

/**
*@param string ... list of strings
*/
于 2012-12-09T13:13:27.943 に答える