正しく書こうPHPの関数

2 min read読了の目安(約2300字

正しくって何が正しいねんって思いますが、とりあえずPHPで実装する際に気をつけている点を紹介します。
まずはこちらが良くない関数の例です。

public function thisIs_badtest($value)
{
    return null;
}

そして、こちらが良い関数の例です。

public (static) function thisIsGoodTest(array $checkValueList = []):?int
{
    return null;
}

それでは解説していきます。

解説

まず、いい関数の構成を説明します。

スコープ (静的関数) function 関数名(引数のデータ型 $変数名 = デフォルト値):返り値のデータ型
{
    return null;
}

関数の構成はこんな感じになっています。

スコープ

スコープはその関数がどこから参照することができるか定義しています。
主に使うのはpublic,private,protectedです。

  • public
    • 外部から利用可能
  • private
    • 記載した関数内でのみ使用可能
    • 継承した場合は使用できない
  • protected
    • 記載した関数内でのみ使用可能
    • 継承した場合も使用できる

全てのスコープがpublicになっていることが現場でよくあります。
全てのスコープがpublicになっていると修正する時にプロジェクトのファイル全てから使われている箇所を検索して、問題がないか確認しないといけないため非常に時間がかかります。
対象のclass内でしか使用しない場合はprotectedかpriveteにしてあげましょう。

静的関数

staticを記載すると静的関数として利用できます。
特徴は以下のようにインスタンス化しないで利用できます。

import Sample;
 
$test = Sample::testMethod(1,2);

ただし、静的と書いてあるように関数の中でプロパティを使ったりできません。引数の文字列を結合して返すみたいな場合に使用します。utilとかで使うことが多いのかな。

関数名・変数名

関数名はなんでもいいですが、わかりやすい名前にしましょう。
命名規則は一定にすることで読みやすくなります。命名規則は以下のケースがあります。

  • パスカルケース
  • キャメルケース
  • スネークケース
  • チェインケース(ケバブケース)

あとは変数名にも言えますが、パッとみてわかる名前にしましょう。getData()みたいな名前ではどんなデータを取得できるかわかりません。getDeletedUserData()のような名前だったら一目でどんなデータが取得できるかわかりますよね。
あと、変数では省略して書くことがありますが、変な略し方をするとなんの変数かわからなくなるので辞めましょう。$dctが何の省略かわかりますか?
また、iやtmpはfor文のような数行内でしか使われない場合は許されることはありますが、処理全体で使うとなんの変数かわからなくなるので使わないでください。あと、$unko使いがちなエンジニアいますがやめましょう。
taro_1,taro_2???万死に値します。

引数のデータ型

渡す引数のデータ型を指定できます。
なんらかの特別な制約がある場合は設定しないでint型やstring型でも渡せるようにしてもいいですが、コードが汚くなる可能性が高いです。
データ型を指定してあげることで予期しないデータが渡された時にその時点でエラーを吐いてくれます。
PHPだとできませんが、javaだと同じ名前の変数でデータ型が違うと別の関数として認識してくれたような…引数の数が違うとだっけな?

デフォルト値

デフォルト値は引数が渡されなかった場合に設定される初期値です。
ここは使用次第で、絶対に渡さなければならない場合は設定しない、初期値がすでにわかっている場合などは設定するって感じですね。
ちなみに、デフォルト値が設定されている引数の後にデフォルト値が設定されていない引数を渡す場合、デフォルト値が設定されている引数は必須となるので意味がなくなりますので、順番は気をつけましょう。

返り値のデータ型

その関数がどのようなデータ型を返すか指定します。
最初に?をつけてあげることでnull許可になります。

public function sampleFunction(): ?int
{
    return null;
}

基本的に一つの関数が返す変数のデータ型は同じ方が関数の複雑性が減るのでおすすめです。
ひとつの関数で一つの機能を実装するというunix哲学的な感じです。

波括弧の場所

波括弧の場所は宗教論争がおきますが、主に2通りあります。

public function sample() {
}
 
public function sample()
{
}

返り値のデータ型を指定すると、違う行にしたほうが見やすいと思うので、個人的には下の方法をお勧めします。

public function sample(): ?int {
}
 
public function sample(): ?int
{
}

どちらが見やすいですか?
ただ、すでに決まっているプロジェクトで突然変えると見にくくなるので、その場合は現場に従いましょう。