名前で呼べると色々と幸せになれるかもしれないphp関連の用語あれこれ

# 名前がわかんないものがあると困るよねって話
人と話すときに話題に出したいのに、名前がわからなくって伝えるのが難しい物ってありませんか？
プログラムとかでも、書けるし仕様も知ってるのに名前知らない物って意外とあるんじゃないかなと思います。
○○が××になってるアレ・・・・とか毎回言うのも結構まどろっこしいですよね。
そんな伝えられる時も伝える時も障害になってしまう名前のわからない「アレ」について、名前を調べたので紹介しようと思います。
自分でも名前のわからない物や、個人的に他の人と話すときにこの名前知ってて欲しいな〜って思うかつ、できるだけphpを中心に使われている物を基準に独断と偏見で選定しています。

## スコープ定義演算子
```php
::
```
[参考](https://www.php.net/manual/ja/language.oop5.paamayim-nekudotayim.php)
特定のスコープを指したり、staticのプロパティやメソッドにアクセスすることができるトークン。
これの名前って何なんだ・・・？そもそもあるのか？と思って調べたら名前が出てきたので、意外と名前知らないなと思ったのが今回の記事を書くことになったきっかけ。
ちなみに`Paamayim Nekudotayim`という別名がつけられているらしく、ダブルコロンを意味するヘブライ語なんだとか。

```php
class Sample
{
    const NAME = 'name';
}

var_dump(Sample::NAME);
```

## 宇宙船演算子
```php
<=>
```
[参考](https://www.php.net/manual/ja/language.operators.comparison.php)
左項と右項を比較した結果に応じて、対応するint値を返却してくれる演算子。
結果と対応する値は下記の通り。
1.小さい => 0より小さい
2.同じ => 0
3.大きい => 0より大きい

```php
var_dump(10 <=> 50);
var_dump(50 <=> 50);
var_dump(100 <=> 50);

// int(-1)
// int(0)
// int(1)
```

あまり使うことは多くないですが、使うことが多くないからこそいざ使うときに困るというのがこの手の常。

## null合体演算子
```php
??
```
[参考](https://www.php.net/manual/ja/language.operators.comparison.php)
左項の値がnullの場合に右項の値として評価され、そうでない場合は左項の値として評価される演算子。
左項の値が存在しない場合でもwarningやnoticeが発生しないため、配列からキー指定で値を取り出す時とかに便利ですね。

```php
$nullValue = null;
$notNullValue = 'this variable is not null';

var_dump($nullValue ?? 'this variable is null');
var_dump($notNullValue ?? 'this variable is null');

// string(21) "this variable is null"
// string(25) "this variable is not null"
```

## ジェネレータ
```php
function hogeGenerator()
{
    // 何かしらの反復処理の中でその結果を都度返す
    yield $a;
}
```
[参考](https://www.php.net/manual/ja/language.generators.php)
イテレータを簡易的に実装するための仕組みのこと。
ジェネレータ関数を作成、その中で何かしらの反復処理を行い、その値を都度yieldで返すことにより内部情報を記憶しておくiteratorオブジェクト分のメモリだけで大量のデータを扱うことができます。
例えば下記の例であれば、場合によっては4年分の日付文字列を配列に入れて扱う必要があるかもしれないところを、
iteratorオブジェクト分のメモリだけで扱うことができるようになります。

```php
// 指定した年と経過年数から存在する全ての日付文字列を返す
function allDaysByYear(int $year, int $addYear): iterable
{
    $dateTime = (new DateTime("{$year}-01-01"));
    
    $limitYear = $year + $addYear;
    $limitDateTime = (new DateTime("{$limitYear}-01-01"));
    
    while ($dateTime < $limitDateTime) {
        yield $dateTime->format('Y-m-d');
        $dateTime->modify('+1 day');
    }
}

foreach (allDaysByYear(2020, 4) as $dateTimeFormatString) {
    var_dump($dateTimeFormatString);
}

// string(10) "2020-01-01"
// string(10) "2020-01-02"
// string(10) "2020-01-03"
// ..(中略)
// string(10) "2023-12-29"
// string(10) "2023-12-30"
// string(10) "2023-12-31"
```
正直この仕組みの存在を知っている人は名前も知ってる人がほとんどかも？
僕は実装済のプログラムから見たのがジェネレータとの馴れ初めだったので、しばらくの間yield(イールド)って呼んでました・・・。

## 可変関数
```php
$func = 'funcName';
$func();
```
[参考](https://www.php.net/manual/ja/functions.variable-functions.php)
変数名の後ろに括弧をつけることで、その変数の値と同名の関数を実行する仕組みのこと。
コールバックの実装とかで使ってる人もいるのではないでしょうか。

```php
function hello(): void
{
    var_dump('hello');
}

function goodBye(): void
{
    var_dump('goodBye');
}

$func = 'hello';
$func();
$func = 'goodBye';
$func();

// string(5) "hello"
// string(7) "goodBye"
```

この言語仕様自体は結構知ってる人多そうですが、可変関数って名前知ってる人もほぼ同数かと言われるとどうかというイメージ。
少なくとも僕は自信持って答えられるような状態ではなかったですはい。

## クロージャ
```php
function ($arg) {
  // 何かしら処理
}
```
[参考](https://www.php.net/manual/ja/functions.anonymous.php)
無名関数とも。
関数名の指定なしに関数を作成できるようになる仕組みのこと。
コールバック関数として使われていることを見るのが多いでしょうか。
個人的にこれを自由に扱えてると、初心者ではないなってイメージ。

```php
// 無名関数は変数に入れて使用も可能
$closureFunc = function (int $value) {
    // 渡された値を二倍にして返す
    return $value * 2;
};

$array = [
    1,
    2,
    3,
    4,
];

// コールバックとして使用
var_dump(array_map($closureFunc, $array));
// もちろんそのまま呼び出しもできる
var_dump($closureFunc(10));

// array(4) {
//   [0]=>
//   int(2)
//   [1]=>
//   int(4)
//   [2]=>
//   int(6)
//   [3]=>
//   int(8)
// }

// int(20) 
```

## アロー関数
[参考](https://www.php.net/manual/ja/functions.arrow.php)
無名関数の簡潔な書き方。
java scriptでは割とメジャーな書き方なので、そっちやってる人は結構知ってる人多そうですね。

```php
fn ($arg) => $arg
```

```php
$arrowFunc = fn (int $value) => $value * 2;

$array = [
    1,
    2,
    3,
    4,
];

// 使い方は基本一緒
var_dump(array_map($arrowFunc, $array));
var_dump($arrowFunc(10));

// array(4) {
//   [0]=>
//   int(2)
//   [1]=>
//   int(4)
//   [2]=>
//   int(6)
//   [3]=>
//   int(8)
// }

// int(20) 
```

# 記事を書き終えて
結果的にphpのリファレンス眺めてその解説を載せた感じになっちゃった気がします・・・が、
普段そんなことそうそうないのでいい機会になったかなあと。
後思ったよりはちゃんと名前知ってるなと再確認もできたり。
色々見つかって面白いのでみなさんも気が向いたら見てみるのもまた一興かもしれません。