どーも!
たかぽんです!
今回はlaravel 7.xから実装されたexactlyヘルパーメソッドについて調べてみようと思います。
exactlyヘルパーメソッドってどんな動きするの?
まずはexactlyヘルパーメソッドとはなんなんでしょうか...?
実は先日文字列の比較をしたいなあ〜便利なメソッドとかあるのかなぁ〜?と思って調べてみると...
laravel 7.xからexactlyヘルパーメソッドというものがあったので、そちらを使ってみました。
基本的には文字列が完全に一致している場合にtrueを返し、そうでない場合はfalseを返すそうです。
ただ、完全に一致...
どこまで一致なんだろうか...
いまいちわかりづらいので、試してみようと思います!
基本的な動作に関しては以下です。
Takapon:MyProject taka$ php artisan tinker
Psy Shell v0.10.4 (PHP 7.3.9 — cli) by Justin Hileman
>>> use Illuminate\Support\Str;
>>> $result = Str::of('Laravel')->exactly('Laravel');
=> true
>>> $result = Str::of('Laravel')->exactly('Laravell');
=> false
今回の検証ではlaravelのTinkerを使用します。
Tinkerに関しては以下の記事をご参考ください。
上記の結果のように、"of"に渡す引数と、"exactly"に渡す引数が一致しているかを確認することができます。
LaravelとLaravelなら一致しているのでtrue, LaravelとLaravellなら一致しないのでfalseが帰ってきていますね。
では、少し違った値の比較も試してみます。
数値型の比較はできる?
文字列方では比較ができましたね。
では、数値型は扱えるんでしょうか...?
試してみましょう。
>>> Str::of(100)->exactly(100);
=> false
>>> 100 === 100
=> true
>>> $result = Str::of('100')->exactly('100');
=> true
最初に同じ値の数値型を比較していますがfalseになります...
やはり、数値型は扱えないようですね...
Str系のメソッドはそもそもがString型を想定しているためでしょう。
厳密等価演算子では確かにtrueが返ってきますが、exactlyメソッドではそうはならないので注意が必要ですね。
ただ、文字列として扱う(シングルクオートでくくる等)場合は、等価とみなされるようです。
厳密等価演算子では比較対象が文字列になることを保証しなければ数値が入って正しくない結果が返ってくる可能性がありますが、真に文字列のみの比較をしたい!という場合は便利かもしれませんね!
大文字小文字の比較はできる?
次は大文字小文字の比較です。
>>> $result = Str::of('laravel')->exactly('Laravel');
=> false
大文字小文字を比較しましたが、やはりそこは厳密に比較してくれるようです!
大文字小文字で違う場合もちゃんとfalseが返ってきました!
文字列を結合して比較はできる?
PHPだと、以下のように文字列の結合ができます。
$a = 'hoge';
$b = 'huga';
$c = $a . $b . 'hugo'; //hogehugahugo
この結合を引数に渡しての実行ももちろん、可能です。
// 変数を用意
>>> $prefix = 'Laravel';
=> "Laravel"
>>> "{$prefix}7.0";
=> "Laravel7.0"
>>> "{$prefix}".'7.0';
=> "Laravel7.0"
// 厳密等価演算子の場合
>>> 'Laravel7.0' === "{$prefix}7.0";
=> true
>>> 'Laravel7.0' === "{$prefix}".'7.0';
=> true
// exactlyメソッドの場合
>>> $result = Str::of('Laravel7.0')->exactly("{$prefix}7.0");
=> true
>>> $result = Str::of('Laravel7.0')->exactly("{$prefix}".'7.0');
=> true
まとめ
今回はexactlyメソッドについてみていきました!
正直厳密等か演算子でもいいのでは?と思いましたが...
ユースケースを考えてみると、数値型も混ざってくるような値がある中で文字列のみ扱いたい場合...とかでしょうか...
ただ、このメソッドを使えば確実に文字列が等しい場合のみ!trueが返ってくるというのは保証できそうなので、そういう意味では便利かもしれません。
機会があれば是非使ってみてくださいね!
それでわ!