r.blog

Cakephp3の/** @return xxx */などのコメントっぽい記述について

Controller、Modelのクラスやメゾットの上にある下記の記述について。

/**
  * Index method
  *
  * @return \Cake\Http\Response|null
  */


コメントのようなので「Cakephp コメント @return」でググるんですが、なかなか記事が見つからず…
どうやらコメントではなく、PHPDoc、DocBlock、ドキュメントブロックなどと言うそう。
(記事に引っかかってても、その言葉を知らなかったのでスルーしていたのかもしれません…)

PHPDocとは

そのクラスやメゾットの説明を書いておくものです。
書き方は大まかに決まっていて、まず最初に説明があり、その次に@paramなどのタグと説明を書いていきます。(アノテーションともいう)
タグの種類はたくさんあり、それぞれ説明されるものが異なります。
@paramなら引数の説明、@returnなら返り値の説明…など。
これを書いておくことで、他の人がPHPDocを見ただけでそのクラスやメゾットがどのようなものか、何を渡せばいいか、何が返ってくるかなどを知ることができます。

コメントのようですが、コメントより開始のアスタリスクが1つ多いのが特徴(/** */)です。

/*
  * これは複数行コメント
  */

/**
  * これはPHPDoc 
  */


PHPDocの読み方

CakePHPでnewsをbakeしたときにNewsController.phpに出来たViewメゾットを見てみます。

/**
  * View method
  *
  * @param string|null $id News id.
  * @return \\Cake\\Http\\Response|null
  * @throws \\Cake\\Datasource\\Exception\\RecordNotFoundException When record not found.
  */
public function view($id = null)
{
    $news = $this->News->get($id, [
        'contain' => ['Newscategories'],
    ]);

    $this->set('news', $news);
}

- View method
メゾットの説明です。そのまま。

- @param string|null $id News id.
@param / string|null / $id / News id.で区切って読みます。
@paramは引数の説明、つまり($id = null)を指します。
string|nullは型の説明、この場合stringかnullが入ることを表します。
$idはメゾット内の変数名を表します。
News id.は説明です。

- @return \Cake\Http\Response|null
@returnは戻り値の説明です。このメゾットで何が返るかを説明します。
この場合httpレスポンスかnullが返ります。

- @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
@throwsはどんな例外を発生させる可能性があるのかを説明します。
\\Cake\\Datasource\\Exception\\RecordNotFoundExceptionは例外のタイプ、
When record not found.は説明です。
例外、というのが知識不足でよくわからずなのですが、対応するidのレコードがない場合、RecordNotFoundExceptionタイプのエラーを発生させ説明文を表示させる、といった内容?

PHPDocの書き方

必須項目は人によるかもしれませんが、
@var @param @return
…は最低限書いたほうがいいのかもしれません。

@var [型] 説明 … 変数の型を明示

/**
  * API version number
  *
  * @var string
 */
protected $version = '2.0';


@param [型] 変数名 説明 … 引数の説明
@return [型] 説明 … 返り値の説明

/**
  * 税込価格を計算
  * 
  * @param int $price 本体価格
  * @return double 税込価格
  */
    public function getTaxedPrice($price)
    {
      $taxPrice = $price * 1.08;

      return number_format($taxPrice);
    }

getTaxedPrice(1000);
// 結果 1,080