はじめに

自称Webアプリ屋のサカベです。
社内では私のことをインフラ屋と呼ぶ人が多くて困っています。
前回までRedisについての記事を書いていて、「やっぱりインフラ屋じゃん」と言われてしまっていたので、今回はWebアプリ屋らしく本業のPHPについて書いてみます。

さて、私は普段、社内のいろんな情報を管理する統合管理システムなるものをメインに開発・運用しています。
この統合管理システムですが、PHPをインストールする段階で、せっかくだからとPHP7.1を入れてみました。
せっかくPHP7.1にしたからには、PHP7.1ならではの書き方をしよう、と新しい機能を積極的に使ってみています。
PHP7系になってからというもの、そこそこ新しい書き方が出来るようになっていて、個人的には嬉しい限りです。

今回はまず、そのPHP7ならではの書き方の中でも私自身がよく使う「スカラー型宣言」について書いてみたいと思います。

スカラー型宣言とは

PHP5では「タイプヒンティング」とも呼ばれていたやつですね。
関数のパラメータの型を強制することが出来る機能です。
要求された型と違う型の値が渡されてきた場合、キャストして渡すか、もしくは例外を投げます。

PHP5では

PHP5系の時には、「クラス・インターフェイス」「コールバック」「配列」の3種類に限られていました。
なので、こういう書き方は従来から出来ました。

<?php
$hoge = 'array';
funcVarDump($hoge);

function funcVarDump(array $hoge) {
    var_dump($hoge);
}

この場合、結果は以下のようになります。

Fatal error: Uncaught TypeError: Argument 1 passed to funcVarDump() must be of the type array, string given

「array欲しいのにstring投げてるんじゃねーぞ!」とでも言いたげな。

PHP7以降では

PHP7.0以降では、先述の3種類に加えて、

  • bool
  • float
  • int
  • string

の4つの型も強制出来るようになりました。
一通りの型を強制出来るようになったということですね。

<?php
$str = 'int';
sum($str);

function sum(int $num) {
    var_dump($num + $num);
}
Fatal error: Uncaught TypeError: Argument 1 passed to sum() must be of the type integer, string given

intを強制しているので、string渡したら当然こうなりますね。
ちゃんとintを渡せば、こうなります。

<?php
$num = 2;
sum($num);

function sum(int $num) {
    var_dump($num + $num);
}
int(4)

なお、int強制に対してstringの'2'など、キャストが出来る範囲であればキャストしてくれちゃうようです。
先程のは'int'という文字なので、どうやってもintにキャスト出来ん!ムリ!と例外を投げているんでしょう(そんな軽いノリなはずはありませんね)

<?php
$num = '2'; // string
sum($num);

function sum(int $num) {
    var_dump($num + $num);
}
int(4)

このように、型を強制することで、 型の不一致による差異などを気にせず書くことが出来るようになる ので、静的型付け言語のような、縛りの強いコーディングが出来るようになります。

PHPはあまり型を意識せずに書けてしまうのが、長所でもあり短所でもありました。
そのPHPの特徴と真っ向から反発するような書き方ですが、個人的には型をかなり気にするクチなので、めっちゃよく使います。

副産物

ちなみに、このスカラー型宣言を使っていると NULLチェックが出来る という副産物があったりします。

<?php
$null = NULL;
sum($null);

function sum(int $num) {
    var_dump($num + $num);
}

このようなプログラムがあったとして、結果は以下のようになります。

Fatal error: Uncaught TypeError: Argument 1 passed to sum() must be of the type integer, null given

「NULL渡すんじゃねーぞ!」とFatalになっていますね。
string強制の場合でも、同じくFatalが出ます。

<?php
$null = NULL;
funcVarDump($null);

function funcVarDump(string $str) {
    var_dump($str);
}
Fatal error: Uncaught TypeError: Argument 1 passed to string() must be of the type string, null given

以前Qiitaにて、
「もういい加減「nullチェックをしたら安全」とかわけのわからないことを言うのはやめよう」という記事が話題になっていました。
この記事の筆者も

nullがきたらダメなところはNPE(※)で落とそう。そのほうが安全だよ。

と述べている通り、そのメソッド内でNULLが渡されることが望ましくない場合には、スカラー型宣言によって 先にNULLを弾いておく というのも1つの手なのではないでしょうか。

※筆者注:NPE=JavaにおけるNullPointerExceptionのこと。ぬるぽ。 ガッ

もちろんアプリケーションそのものが落ちるのはそれはそれで困っちゃうので、適宜例外処理をよしなに。

nullable

さて、NULLチェックが出来ちゃうよ、という話をしたばかりですが、PHP7.1からは型を強制しつつ NULLは許容する、つまりnullable な状態にすることも出来ます。
型の前に?を付けるだけ。

<?php
$null = NULL;
funcVarDump($null);

function funcVarDump(?string $str) {
    var_dump(is_null($str) ? 'ぬるぽ' : $str);
}
string(9) "ぬるぽ"

これで、「stringを強制したいけど、NULLだけは別処理をしたい!」という上記例のような処理も可能になります。
そんなに使いみちは無さそうですが。

副産物その2

PhpStormのようなIDEであれば、PHPDocumentorを書くのがめっちゃ楽になるという副産物も。
パラメータから勝手に拾い上げてくれるので、@param int $numなどといちいち書かなくて良くなります。

おわりに

こんなのPHPじゃねえ! という方も少なからずいそうなこのスカラー型宣言ですが、個人的にはめっちゃよく使います。
この記事を読んで下さっている皆様も、ぜひ使って欲しいです。

次回以降、他にもPHP7ならではの書き方について触れてみたいと思いますので乞うご期待。

これでしばらくネタに困らない

Shere
  • はてなブログ
  • Twitter
  • Facebook
PHP7ならではの書き方を知る:(1)PHP7のスカラー型宣言を積極的に使おうの巻

Writer

  • Name

    サカベ ケンイチ

  • Position

    横浜と大洗を往復する自称Webアプリ屋。

  • Profile

    必要あればサーバー構築からバックエンド、ちょっぴりフロントまで担当するWebアプリ屋。 本業はPHPエンジニア。 アプリも手を出そうとC#+Xamarin勉強中。 そして必要あれば曲も作る。なお出番は無い模様。