PHP7.3.0からできるようになったこと


## はじめに

2018年12月6日に、PHP 7.3.0がリリースされました！:raised_hands:
PHP7.0は既にサポートが終了し、PHP5.6も2018/12/31で終了となってしまいます:scream:
参考：http://php.net/supported-versions.php

そこで、PHP7.3.0からできるようになったことをPHP7.2.13と比較してみました！

## 試した環境
- CentOS Linux release 7.6.1810 (Core) 

## PHP7.3.0からできること

### 追加された関数

- `is_countable ( mixed $var )` `返り値：bool`  
...引数が、数えられる値かどうかを調べることができます。   
今までだと　`（ is_array($arrEto) || $arrEto instanceof Countable ）`　で代用する必要がありました。

```php:
$arrString = ['お', 'な', 'か', 'す', 'い', 'た'];
var_dump(is_countable($arrString));   //bool(true)

$string = 'おなかすいた';
var_dump(is_countable($string));      //bool(false)
```

  
- `array_key_first ( array $array )` `返り値：mixed`  ...配列の最初のキーを取得できます。
- `array_key_last ( array $array )`  `返り値：mixed`  ...配列の最後のキーを取得できます。

```php:
$arrEto = array(
    '2018年' => '戌',
    '2019年' => '亥',
    '2020年' => '子',
    '2021年' => '丑',
);
var_dump(array_key_first($arrEto));  //string(7) "2018年"
var_dump(array_key_last($arrEto));   //string(7) "2020年"
```

  

- `hrtime ([ bool $get_as_number = FALSE ] )` `返り値:mixed`  
-...ナノ秒単位でタイマーを測ることができます。  

```php:
$a = hrtime(true);
sleep(3);  //3秒(=3*(10の9乗)ナノ秒)スリープさせる
$b = hrtime(true);

$nano = $b - $a;              //ナノ秒
$second = $nano / pow(10, 9); //秒 に変換

var_dump($nano);     //int(3001999046)
var_dump($second);   //float(3.001999046)
```


### heredoc/nowdocが柔軟にかけるようになりました。
- heredoc ... 「"」で文字列をくくるのと同様で**変数展開が可能**である。  
`<<<EOD`と`EOD;`で文字列をくくるやつ。「EOD」の部分はなんでもよい。
- nowdoc  ... 「'」で文字列をくくるのと同様で**変数展開が不可能**である。   
`<<<'EOD'`と`'EOD';`で文字列をくくるやつ。「EOD」の部分はなんでもよい。



終端IDの行にインデントやコメントを入れることが可能になりました。
また、heredoc/nowdocの後に文字連結することもできます。
ただし、タブとインデントを混ぜたり、終端IDのインデントを文字列より右側にするとエラーになります。
    
    

```hoge.php
<?php

class Hoge
{
    public function getMessage(): void
    {
        $php_version = PHP_VERSION;
        echo $message = <<<EOM
          PHP Version:
          {$php_version}
        EOM . ' 終端IDの行に文字結合してみる。';  //行先頭にインデントをとり、heredocの後に文字連結もしています。
    }
}

$hoge = new Hoge();
$hoge->getMessage();
```

PHP7.3.0

```vim:
[vagrant@localhost ~]$ php hoge.php 
  PHP Version:
  7.3.0 終端IDの行に文字結合してみる
```

PHP7.2.13 (パースエラーになっちゃいます)

```vim:
[vagrant@localhost ~]$ php hoge.php 
PHP Parse error:  syntax error, unexpected end of file in /home/vagrant/hoge.php on line 18
```


## 関数コール引数の末尾にカンマが使えるようになりました。
※もともと配列の末尾にはカンマは使えます。

```php:hoge.php
<?php

$arrEto = array(
    '2018年' => '戌',
    '2019年' => '亥',
    '2020年' => '子',
    '2021年' => '丑',           //ここは以前からカンマ使えてます。
);

$arrEto = array_merge(
    $arrEto,
    array('2022年' => '寅'),    //関数コール引数の末尾カンマ！
);

var_dump($arrEto);
```

PHP7.3.0

```vim:
[vagrant@localhost ~]$ php hoge.php 
array(5) {
  ["2018年"]=>
  string(3) "戌"
  ["2019年"]=>
  string(3) "亥"
  ["2020年"]=>
  string(3) "子"
  ["2021年"]=>
  string(3) "丑"
  ["2022年"]=>
  string(3) "寅"
}
```

PHP7.2.13

```vim:
[vagrant@localhost ~]$ php hoge.php 
PHP Parse error:  syntax error, unexpected ')' in /home/vagrant/hoge.php on line 13
```


### preg_quote()のエスケープ対象として、「#」が追加されました。

PHP7.3.0

```php:
php > var_dump(preg_quote('#'));
string(2) "\#"
```


PHP7.2.13

```php:
php > var_dump(preg_quote('#'));
string(1) "#"
```
※`php -a`よりインタラクティブモードで実行しています。



### PHP7.4からプロパティにも型が指定できるようになります。(予定)
参考：https://qiita.com/rana_kualu/items/9b4502d229d19635ef34
  
※現在、以下コードのように、**関数コール引数**や**戻り値**の型指定はできます。

``` php:
<?php

class User
{
    public $memberId;  //ここにも型指定が可能に！　　public int $memberId;
    public $userName;  //ここにも型指定が可能に！ public string $memberId;

    public function setMember(int $memberId, string $userName): void
    {
        $this->memberId = $memberId;
        $this->userName = $userName;
    }
}

$userObj = new User();
$userObj->setMember(123, 'taro');

```



## まとめ
まだまだ、PHP7.3.0での変更はあります！
よければ以下記事を参考にしていただければと思います。

- リリースノート  
http://php.net/ChangeLog-7.php#7.3.0