PHP7の新規機能その1

福岡拠点の永嵜です。

現時点(2019/2/25)でのPHPの最新バージョンは7.3です。
PHP7.0リリースの際にパフォーマンスの向上や多くの新機能が追加されていますが、私自身があまり新機能を使えていなかったので新機能について調べました。
このブログでPHP7.0以降に追加された機能をいくつか紹介したいと思います。

1.引数/戻り値の型宣言
関数の引数/戻り値に明示的に型を指定することができるようになりました。
型を指定することで不正な値が渡されるのが防げます。
通常、Nullは許容されませんが型の前にクエスチョンマークをつけるとNullを許容でき指定した型だけでなく Nullも引数/戻り値として使用できるようになります。

サンプルプログラム
引き数 $a、$b、戻り値にint型指定を指定しています。

実行結果
宣言した型以外(キャスト出来る場合OK)が引数で指定されるとTypeErrorの例外がスローされます。

注意点
引数/戻り値が指定した型にキャストできる場合は、自動的にキャスト変換されて
正常終了します。厳密に型チェックを行いたい場合は、declare(strict_types=1)命令を使用する必要があります。

※PHP5でも型宣言(タイプフィンディング)は使用できましたが、
以下の制約がありました。
・戻り値では型宣言ができない。
・引数で型を宣言できるのは配列/オブジェクトのみ
(int/floatのような型宣言はできない)

指定可能な型は以下の通りです。

型名

概要

使用可能バージョン

bool 真偽値 7.0.0~
float 浮動小数点数 7.0.0~
int 整数 7.0.0~
string 文字列 7.0.0~
array 配列 5.1.0~
callable コールバック関数 5.4.0~
クラス名 指定したクラス 5.0.0~
インターフェイス名 指定したインターフェイス 5.0.0~
self そのメソッドが定義されている
クラスと同じクラスのインスタンス
5.0.0~
void 戻り値が特に無いことを指定

7.1.0~

2.Null合体演算子
式1 ?? 式2
式1がNullでない場合には式1をそうでない場合は式2を返します。

サンプルプログラム

実行結果
$message2はNullのため式2の値が表示されています。

 

3.宇宙船演算子
2つの式を比較するための演算子です。
左辺<=>右辺
左辺が大きい:戻り値「1」
右辺が大きい:戻り値「-1」
両辺が等しい:戻り値「0」

サンプルプログラム

実行結果

 

4.最後に
今回紹介しきれなかった機能を次回紹介します。

[Laravel]ビュー

福岡拠点の香月です。

今回はビューです。前回のルートとコントローラで呼び出されたURLに対してPHPでのプログラム処理ができるようになりました。
今回はここで実際にデータを集計して、結果を画面に表示したいと思います。この画面表示部分がMVCモデルのV(View)です。
Laravelの標準テンプレートエンジンはBladeとなっています。

それでは早速コントローラの実装です。
前回の実装ではLaravelのようこそ画面を呼び出していましたが、今回は”top”とう名前のテンプレートを使用して画面を表示するようにします。テンプレートファイルは後で作成します。
app/Http/Controllers/TopController.phpファイルを編集します。

モデルScoreに追加した2つのメソッドを呼び出して得点に関するデータを取得しています(ソースは後ほど)。$daysには試験実施日の一覧が、$scoresには試験の点数データが入ってきます。
$subjectsでは科目一覧を取得しています。
$studentsは配列として定義していて、続くforeachで点数データ列挙しながら二次元配列を作成します。一次元目に生徒名、二次元目に科目ID、その値として点数を設定しています。
最後にreturn view(‘top’)で画面を呼び出すと同時に、topテンプレート内で使用するデータを->with()で指定しています。(->with()の複数回の呼び出しは、一回の->with()の呼び出しに置き換えることができます。その場合、->with()の引数にはキー、バリューの配列を設定します)

実装の先頭で$request->input(‘day’)を使っています。コントローラメソッド(ここでいうindex())ではメソッドインジェクション(依存注入機能)を使ってRequestクラスのインスタンスを取得することができ、ユーザーリクエストの内容を利用できます。

次はScoreにメソッドを追加します。app\Score.phpを編集しましょう。

getDays()では試験日フィールドexam_dayをグルーピングして、日付の昇順に並び替えた結果を取得しています。exam_dayフィールドは時間まで入っているので、日付だけの書式に書き換えて配列に置き換えています。

getList()では引数で指定された試験日だけのデータを取得し、それに対してLEFT OUTER JOINで科目と生徒を連結した結果を返します。

さあ、ここまでくるとあとはビューを作成します。
resource/views/welcome.blade.phpをコピーしてresource/views/top.blade.phpを作成し、中身を編集します。
コントローラの最後で return view(‘top’) を呼び出していましたが、Laravelではこれでresource/viewsフォルダにあるtop.blade.phpの呼び出しと判断してくれます。

画面のタイトル「Score sheet」を表示します。
その下には試験日の一覧$daysを@foreachで列挙して表示します。各試験日はaタグでリンクを作成し、クリックするとその日の表示に切り替わるようにしています。ここでroute(‘top’)を呼び出していますが、前回route/web.phpファイル内でRoute::get(‘/’, ‘TopController@index’)->name(‘top’);と指定した名前ですね。これによりこのリンク先が。/ に設定されます。
最後にtableタグで点数表を表示します。縦に生徒軸、横に科目軸を設定して、各生徒の点数を表示するようにしています。それぞれ@foreachでループしながらテーブルを生成しています。

これで実装が完了しました。実際に画面を表示して見ましょう。
表示するデータはシーダーで用意したデータです。
こんな感じで画面が表示されます。

Bladeテンプレートエンジンでは@foreach以外にも@if, @elseや@switch, @case, @breakなどの制御構文が使えます。

また、テンプレートの継承や@includeなど、他のテンプレートファイルと組み合わせて1つの画面を作成することができます。同じ内容を複数のファイルに書くと、後からの編集が大変ですね。その手間をなくすために積極的に活用しましょう。