18
13

More than 1 year has passed since last update.

public staticとは?

Last updated at Posted at 2019-11-23

Laravelのバリデーションのルール

Laravelでバリデーションのルールは様々な書き方があると思うが、もしModelに書くとこのようになるだろう。

namespace App;

use Illuminate\Database\Eloquent\Model;

class Test extends Model
{
  public static $rules = array(
    'title' => 'required',
    'body' => 'required',
  );
}

そして、Modelに書いたルールをControllerではこのように利用できる。

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Test;

class TestController extends Controller
{
  public function create(Request $request)
  {
    $this->validate($request, Test::$rules);

    $test = new Test;
    $input = $request->all();

    $test->fill($input);
    $test->save();
  }

ほとんどの場合、バリデーションのルールは public static 変数名... と書き出すことが多い。

public static とはなにか?

PHPの公式サイトにはこのように記されている。https://www.php.net/manual/ja/language.oop5.static.php

クラスプロパティもしくはメソッドを static として宣言することで、 クラスのインスタンス化の必要なしにアクセスすることができます。 static なプロパティは、インスタンス化されたクラスオブジェクトから アクセスすることはできません (static なメソッドにはアクセスできます)。

「クラスのインスタンス化」というのは、上のコードのControllerでは $news = new Test; にあたる。
これがクラスのインスタンス化である。

クラスはインスタンス化、これはざっくり言うと変数を初期化することに近い。
変数の初期化との違いは、クラスに定義されたメソッドなどをそのまま流用できる点である。

しかし public static という宣言をしたものについて、クラスのインスタンス化は意味がない。
クラス::プロパティ と書くことでクラスの中のプロパティを参照することができる。

$this->validate($request, Test::$rules); と書くことで、Test というクラスの中の $rules を参照していることになる。

public static の使いどころ

public static について説明をしたがこれは何のためにあるのか?という疑問が出てくる人がいると思う。
ほとんどのプログラムはクラスをインスタンス化して、そのクラスのプロパティが変化していくことが多い。
例として上のコードでは、リクエストを受け取ってデータベースに保存するが、リクエストは毎回内容が違う。

しかし、バリデーションのルールはリクエストに応じて変わらない。
リクエストに応じて変わらないとは、インスタンス化の有無に関わらずプロパティが変化しないことになる。
このときに public static を利用すると良い。

まとめ

  • public static では new が必要ない。
  • public static でが new よって生まれたインスタンスの状態が変化しないときに利用すると良い。
18
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
13