PHPのグローバルなユーザー定義関数の名前はスネークケースにするべきだと思う

# 前提
## PSRには関数の命名規則について記載がない
[PSR](http://www.php-fig.org/psr/)には、関数の命名規則についての記載がありません。
下の表のとおり、クラスとメソッドについては決められています。

|項目|PSRでの命名規則|大文字小文字を区別|
|:--|:--|:--|
|名前空間|記載なし|区別しない|
|クラス|[StudlyCaps (アッパー・キャメル)](http://www.php-fig.org/psr/psr-1/#namespace-and-class-names)|区別しない|
|メソッド|[camelCase (ローワー・キャメル)](http://www.php-fig.org/psr/psr-1/#methods)|区別しない|
|関数|記載なし|区別しない|
|プロパティ|[自由 (ただし統一すること)](http://www.php-fig.org/psr/psr-1/#properties)|**区別する**|
|クラス定数|[大文字とアンダースコア](http://www.php-fig.org/psr/psr-1/#constants)|**区別する**|
|変数|記載なし|**区別する**|
|定数|記載なし|**区別する**|

## 関数名は大文字小文字を区別しない
上の表のとおり、ケース・センシティブなのはプロパティ名と変数名、定数名だけです。
関数は、たとえ`BAZFUNC`と定義していても、`bazfunc()`で正常に実行できます。
確認のために下記を実行してみてください。

```php
<?php
namespace FOO\BAR;

class BAZCLASS
{
    public $BAZPROP = "プロパティ\n";
    const BAZCLASSCONST = "クラス定数\n";
    public function BAZMETHOD()
    {
        return "メソッド\n";
    }
}

$obj = new \foo\bar\bazclass();
echo $obj->bazmethod();
echo $obj->bazprop; // Noticeで警告される
// echo BAZCLASS::bazclassconst; // Fatal errorで処理が止まる

function BAZFUNC() {
    return "関数\n";
}

echo \foo\bar\bazfunc();

$BAZVAR = "変数\n";
echo $bazvar; // Noticeで警告される

define('BAZCONST', "定数\n");
echo bazconst; // Noticeで警告される
```


# スネークケースを推す理由
## get_defined_functionsが強制的に小文字で返しても影響が少ないから
定義済みの関数を配列で返す[get_defined_functions](http://php.net/manual/ja/function.get-defined-functions.php)は、名前を全て小文字に変換してしまいます。

```php
<?php
namespace FOO\BAR;

function BAZFUNC()
{
    return 'BAZ!';
}

$arr = get_defined_functions();
foreach ($arr['user'] as $val) {
    echo $val.'<br>'; // foo\bar\bazfunc と表示される
}
```

私の体験ですが、PHPフレームワークのLaravelで使えるグローバルな関数を確認しようとして`get_defined_functions`を実行したところ、`doublevalue`という関数を発見しました。
これの定義場所を知りたくてファイル横断検索をしたところ、何もヒットしませんでした。
これは、本来の関数名が<code>double<strong>V</strong>alue</code>で、さらに私が「大文字小文字を区別する」という設定で検索していたことが原因でした。
ものすごく発生確率の低いつまづきですが、それでもスネークケースで`foo_bar_baz`のように定義しておけば、こんな些細なことでつまづくことはありません。

なお、上に挙げたグローバル関数の[doubleValue](https://github.com/hamcrest/hamcrest-php/blob/master/hamcrest/Hamcrest.php#L706)は、実際の処理は[IsDouble::doubleValue](https://github.com/hamcrest/hamcrest-php/blob/master/hamcrest/Hamcrest/Type/IsDouble.php#L30)メソッドに丸投げしているようで、名前を統一するために敢えてローワー・キャメルにしているのだと思います。

※`doubleValue`はLaravelが公式に提供しているグローバル関数ではなく、Laravelが依存しているComposerパッケージで定義されているグローバル関数です。
「Laravelとしては本来なら隠してしまいたいんだろうけど、グローバルだから呼び出せてしまう」という状態です。
詳しくは下記をご覧ください。
:link: [Laravel5.4: 公式ドキュメントでは言及されていないヘルパー関数](http://qiita.com/sutara79/items/bdafa8c69f9f3774fef6)


### (補足) get_class_methodsはそのまま返す
`get_defined_functions`と比べて、クラスメソッドを配列で返す[get_class_methods](http://php.net/manual/ja/function.get-class-methods.php)は、大文字小文字を変換せずそのまま返します。

```php
<?php
namespace FOO\BAR;

class BAZCLASS {
    public function BAZMETHOD()
    {
        return 'BAZ!';
    }
}

$arr = get_class_methods('foo\bar\bazclass'); // 小文字でもOK
foreach ($arr as $val) {
    echo $val.'<br>'; // BAZMETHOD と表示される
}
```

`get_defined_functions`は強制的に小文字。
`get_class_methods`はそのまま。
これは、PHP開発者の「グローバル関数は当然スネークケースでしょ」という姿勢が無意識に反映されたのでは、と感じてしまいます。
もっとも、上の例のとおり`get_defined_functions`は名前空間まで小文字にしてしまうので、その線は薄いと思いますが…。
ともかく、スネークケースならば余計なつまづきをひとつ減らせることは確かです。


## PHPの組み込み関数やLaravelのヘルパー関数がスネークケースだから
:link: [組み込み関数の一覧(配列関連)](http://php.net/manual/ja/book.array.php)
:link: [Laravelのヘルパー関数](https://laravel.com/docs/5.4/helpers)

理由その1で今回言いたいことは全部言ってしまいました。
ただ、上のようにPHPの組み込み関数やLaravelのヘルパー関数(グローバルに使える)でもスネークケースなので、やはりグローバルなユーザー定義関数の名前はスネークケースにするべきだと思います。