Laravel on Hack

  • 7
    Like
  • 0
    Comment

はじめに

Laravelもくもく会 #4 (2017/02/11) のLT資料を書き換えたものです。

PHP7の登場によってすっかり下火になってしまった感がありますが、PHP7にない機能、まだまだありますよ、っというわけで、Laravel と一緒に使ってみました。

気になった機能のうち、

  • ジェネリクス
  • タプル
  • パイプ演算子
  • おまけ: Callableタイプヒンティング
  • 追記: enum

を取り上げます。

環境

HipHop VM 3.15.2
Laravel 5.4

公式ドキュメント

Hack Documentation

サンプルコード

過去に使ったお題を使い回します。
LaravelでテストしやすいControllerクラスをつくる - Qiita

お題: 「無人有料駐車場の管理システム」

仕様

シナリオ

駐車場が満車だったら「満車」、そうでなければ「空車」と表示する

モデル

ParkingLot - 駐車場
+ getStatusLabel - 満車または空車の文字列を返す
# isFull - 満車であれば true, そうでなければ false を返す

  • -- public, # -- protected

ジェネリクス

Hack では array<int, string> みたいな形で型を指定することができます。また、Vector, Set, Map コレクションクラスがジェネリクスに対応しています。

利用の仕方はこんなかんじです。

ParkingLot.php
<?hh

namespace App;

use App\Car;

class ParkingLot
{
    const int CAPACITY = 15;

    private Vector<Car> $container;

    public function __construct()
    {
        $this->container = Vector{};
    }

    public function add(Car $element): void
    {
        if ($this->container->count() === self::CAPACITY) {
            return;
        }
        $this->container[] = $element;
    }
    // (snip)
}

T 型を持つ Vector は T 型の要素しか保持することはできません。

タプル

要素数の決まった配列です。

ParkingLotController.php
<?hh

namespace App\Http\Controllers;

// (snip)

newtype State = int;
newtype MyView = (State, ParkingLot);

class ParkingLotController extends Controller
{
    private MyView $view;

    public function __construct(ParkingLot $parkingLot)
    {
        $this->view = tuple(0, $parkingLot);
    }
    // (snip)
}

ついでに、各要素に割り当てられた値の型を途中で変えることはできません。

より制約の強い配列、というかんじです。

あ、newtype という型エイリアス (既存の型に別名を与える) も Hack 固有の機能です。

パイプ演算子

ParkingLotController.php
// (snip)

    public function enter(ParkingRequest $request): View
    {
        return (int)$request->get('num_cars')
          |> $this->putCars($$)
          |> $this->renderView($$);
    }

Kobito.V70R9c.png

上のフォームフィールドに数字を入れて POST すると、上の enter メソッドが呼ばれます。

int にキャストしないといけないのがイケてないかんじですが、パイプ演算子を使って、前の関数の戻り値を次の関数の引数に $$ で渡して処理をつなげることができます。

おまけ: Callable Type Hinting

PHP

function hoge(callable $callback)
{
    // ...
}

Hack

function hoge((function (int, boolean): int) $callback)
{
    // ...
}

追記: enum

ParkingLotState.php
<?hh

namespace App;

enum ParkingLotState: int {
  VACANT = 0;
  FULL = 1;
}

getValues, isValid など、便利なメソッドも付いてきます。

使用例)


ParkingLotState $state = ParkingLotState::VACANT;
ParkingLotState::isValid($state);

まとめ

特にありませんが、Hacklang 楽しかったです。