エンジニアのひよこ_level10

【毎日更新!】新卒4年目エンジニアブログです!

【PHP】ヒアドキュメント構文で、変数を使ったり、使わない書き方【965日目】

PHPでヒアドキュメント

ヒアドキュメント構文を書く

echo <<<EOL
ringo
gorira
EOL;
ringo
gorira

こんな感じに改行込みで書いても簡単に書けるヒアドキュメント構文。

ここで変数を使いたい。

変数を使う

$str = "test1";
echo <<<EOL
{$str}
test2
EOL;
test1
test2

こんな感じに普通に書けます。

これは、ダブルクオーテーションで文字を囲った時と同じ挙動です。

$str = "test1";
echo <<<"EOL"
{$str}
test2
EOL;
test1
test2

"EOL" のように、区切り文字のEOLにダブルクオーテーションを書いても同様です。

お察しの方もいるかも知れませんが、変数を使いたくない時はシングルクォーテーションで区切り文字を囲みます

変数を使わない

$str = "test1";
echo <<<'EOL'
{$str}
test2
EOL;
{$str}
test2

このように、区切り文字を 'EOL'のようにシングルクォーテーションで区切ると、中の文字はそのまま出力されます。
これは、ヒアドキュメント構文ではなく、Nowdocと呼ばれます。

上手く使い分けると、コードがきれいに書けますねφ(・

【Java】packageとimportの役割。PHPと比較【847日目】

packageとimport

package item;

import htmlitem.Td;

public class Table
{
    Td td = new Td();
}

こんな感じに、packageとimportがある。なにするか。

importは使用するクラスの指定

PHPだと、 useの機能に近いもの。

import java.util.Map;
import java.util.LinkedHashMap;
...
Map<String, Object> map = new LinkedHashMap();

これは以下のようにも書けます。

java.util.Map<String, Object> map = new java.util.LinkedHashMap();

importは、このファイルの処理が参照するクラスを指定するものであり、
下のようにフルのパスで書くならいりません。

クラス指定なので、これをいっぱい書いたからめっちゃメモリに読み込むとかはしません。
(IDEとかがやる静的解析においては話が変わるかもしれませんが・・・)

packageは、グルーピングや名前空間指定

PHPだと、 namespaceの機能に近いもの。
■ただ、機能がもう少しある。

package item;

public class Table
{
    Td td = new Td(); // importを指定していないから、item.Tdを参照する
}

この場合、Tableクラスのフルパスは item.Tableです。
同一package内のクラスは、importを書かなくても大丈夫。

ここまでだと、名前空間を指定するだけの存在になりますが、ファイルのグルーピングの役割もあります。

『同一パッケージ内』というものに影響するものとして、わかりやすいものはアクセス修飾子。
protectedの条件は、

  1. 同一クラス
  2. 同一パッケージ
  3. サブクラス(子クラス)

という条件なので、packageが同一であれば、protectedはアクセス出来ます。
ここらへん、PHPだとclassはpublicしかないようなものなので、namespaceにおいては結構違うところかもしれませんφ(・

【SpringBoot⇔Laravel】環境構築。SpringBootを学んで、Laravelと比べてみる【837日目】

SpringBoot始めました

ちょっと気になってたSpringBoot。
最近Javaが出来る人が近くに増えたので、教えてもらうことにしました!

ということで、まずは環境構築をしてみました。

環境構築

やったことは、こちらの記事を参考にして始めました。

qiita.com

私自身がやったことをバックリ書くと、

  1. JavaSDKのインストール
  2. VSCode拡張機能を2つ入れる(記事参照)
  3. 記事に合わせて作成(MavenではなくGradleを使用しました)

比較

JavaPHPの言語的な差も含んでます。

環境構築時点なので、今後いろいろ増えてくると思います。

比較して良い点

  1. Laravelと違って、余計な初期ページ用コードがない(辛い点でもある)
  2. 追加のコマンド入力がない(composer installとか)
  3. コンパイルがある(エラーに気づける)

ちょっと辛い点

  1. Laravelと違って、初期状態に画面表示可能なコードが入っていない
  2. コンパイルがある(待つ)

詰まったところ(ネット)

バージョン選択のとき、インターネットに繋がってないと動かないよ!

どうやら最新のを確認して取ってきてるみたいね。

環境構築後のコード

github.com

心配なこと

.oO(Laravelと違うからわからないけど、これ私見られちゃいけないのをCommitしてないですよね・・・?わかる方いたら教えて下さい・・・!)

おまけのぼやき

PHPの公式ドキュメントって本当に充実してたんだね!!???

Javaの公式ドキュメント見て絶望してて、前から読みやすいと思ってたけど改めてPHPの公式ドキュメントは、『公式ドキュメントを読め』って言うのは超納得だわ・・・!

三項演算子(x ? y : z)はこわくないヨ。便利だヨ【797日目】

三項演算子アンチパターン

三項演算子』でずっと思ってるのが、
三項演算子のネストとかで『クソコードだー』ってネタにされすぎたせいで、

『よくわからないけど三項演算子は悪だ!』
三項演算子使うのはアンチパターン!』

みたいに言う人いて悲しい(´・ω・`)

代入とかで使うと、めっちゃ見やすくなりますよね……?

なので書いてみた

ということで、こうすると見やすくない?みたいなのを書いてみました。

いろいろ反論あるかもですが、多くを語るよりコードで示してみます。

■before

if ($flag) {
    return "x";
}

return "y";

■after

return $flag ? "x" : "y";
return $flag
    ? "x"
    : "y";

■before

if ($user->role != "user") {
    $name = $user->name;
} else {
    $name = "default";
}

■after

$name = $user->role != "user" ? $user->name : "default";
$name = $user->role != "user" 
    ? $user->name
    : "default";

【Laravel】6.xからバージョンが進むのが早い理由と、バージョンアップのやり方【790日目】

Laravelアドベントカレンダー12日目

Laravel Advent Calendar 2019 - Qiitaの 12 日目の記事です。

先日はおかしょいさんの日本の Laravel 関連コミュニティまとめでした

blog.okashoi.net

さて、アドベントカレンダー12日目を取り続けてもう3年目です。
1年目の記事と比べると、自分の成長を感じられます。
最近新しくアドベントカレンダーに挑戦されている方も見かけられて、凄く嬉しいです。

このアドベントカレンダーも一つのコミュニティの恩恵を受けられる場所だと思います。
素敵な文化を維持するためにも、今年も貢献していきましょう。

Laravel6.6!?

Laravel、皆さんお気づきですか。

もうLaravel6.6が出てますよ/(^o^)\

あれ?チョット前までLaravel5.8じゃなかった?
半年に一回くらいで0.1上がってたよね?

そしてこんなふうに思う人もいるかもしれません。

『『『こんなのバージョンアップなんて出来るわけないじゃんー!!!』』』

ってことで

そうじゃないんだよという話と、アップデートってどんなことをするのかを書こうと思います。

バージョンの付け方が変わった

以前Qiitaの方でも記事を書きましたが、Laravel6.xから、セマンティックバージョニングというものが導入されました。

qiita.com

結論から言うと、バージョンの付け方が変わりました。

セマンティックバージョニングって?

ばっくり説明すると、

Laravel 5.1->5.2->5.3

Laravel 6->7->8

という順にアップデートされるようになりました。

するとどうなる?

Laravel 5.8.0 -> 5.8.1 -> 5.8.2

Laravel 6.0 -> 6.1 -> 6.2

みたいなバージョン付けになります。
前のバージョンで言う、 5.8.xのアップデートが、今の 6.xのバージョンアップなのですね。

後ほど触れますが、これらはだいたい既存の機能を壊したりしない、 マイナーバージョンアップと呼ばれるものたちです。

(バージョンアップ話) 5系から5系にするときは?

さて、ここから本題。
Laravelのバージョンアップって、どうやってやるのでしょう?

手持ちのアプリケーションが壊れるのは置いておいて、一旦Laravelの中身だけバージョンを上げるのは、

1.composer.jsonを開きます。

"laravel/framework": "5.5.*",

こんなふうに書いてる部分が見つかると思うので、ここを書き換えます。

"laravel/framework": "5.6.*",

書き換えたら、ダウンロードをしましょう。コマンドを打ち込みます。

composer update

これで、新しいバージョンがダウンロードされます。
(composer updateは、オプションを付けなかった場合、
他のライブラリもバージョンアップされていた場合は、
そちらも新しいバージョンがダウンロードされます)

laravel/composer.json at 5.8 · laravel/laravel · GitHub

(補足)アスタリスク

ちなみに、 composer updateは、 composer.jsonを参考にして、インストールをいろいろしますが、
そこに、 *などが書かれているものがあると思います。それは、対応の記号に応じて、最新バージョンを取得してくれます。

"laravel/framework": "5.5.*",

これで composer updateをすると、5.5.10 のように、その当時での新しい数値を参考にしてダウンロードしてくれます。

composer.lockがある場合や、 composer installとの違いとかもありますが、一旦ここでは割愛します。

6.xから書き方変わったじゃん?

6.xに戻ります。

composer.json を見てみましょう。

laravel/framework": "^6.2"

github.com

もしかすると、記事を見ている時点では、数値が変わっているかもしれませんが、 これは、 6.2~6.xの最新までをダウンロードしてくれます。
いつの間にか^6.0じゃなくなっててびっくりした

ってことで、6系にアップデートするときには、上のファイルを参考にして、
composer.jsonを書き換えれば良さそう。

でも、6.2や6.3とかで差があるんじゃないの?

この差ですが、先程伝えたように、この6.xのx部分は、マイナーバージョンアップと呼ばれるものです。

これは、既存の機能を壊したりしないようなアップデートが行われます。

例えば?バグやセキュリティの修正。
例えば?LazyCollectionに新しい機能の『追加』。

こんなふうに、アップデートを気軽にしても、アプリが壊れることは殆どないアップデートです。

逆にいうと、昔は・・・

逆に言うと、昔の5.xのx部分のアップデートは、マイナーバージョンアップではないです。

ばんっっっっばん、既存の機能を壊しているメジャーアップデートです。

この認識を間違えていると、マイナーバージョンアップだから5系のバージョンアップ楽勝だろと言われて死にます
なんなら誤解されてて死にかけました。説明大切。

まとめると

5.5 -> 5.6 -> 5.7 -> 5.8 -> 6.x(実質5.9) -> 7.x(実質5.10)

みたいなのが、現在のバージョンアップです。

そして、過去の5.xのバージョンアップは、マイナーバージョンアップではないので、
アップデートするときは覚悟してねっ!ってお話でした。

明日は@n1215さんの記事です。よろしくお願いいたします!

間違えてる点などございましたら、twitterなどで教えていただけますと幸いです。
ここまでお読みくださり、ありがとうございました!

twitter.com

おまけ

マイナーバージョンアップで、だいたいとか、殆どとかいう言葉を使ってる理由。
マイナーバージョンアップで壊しに来る言語がありましてですね?

まあ、そもそも人が作ったものなので、バグが発生したり想定外だったりすることもあるわけで。

目くじら立てすぎないのが1番だと思いますです。

【PHP】Class Xxx does not existの対応【781日目】

対処しにくいエラー

Class App\Controllers\XxxController does not exist

こんな感じのエラーを見たことはあると思う。
これは、クラス自体がルールに則って書かれてない時に起こる。
例えば、関係ないところに文字があったりなど。

手元のコードに、てきとーな文字列を入れてクラスを壊してやれば、再現出来ると思います。

だいたいは、エディター等がエラーを吐いてくれると思います。
だいたいのエラーはそれで対応出来ますが、継承とかだと気づかないことも。

起こったこと

protected function xxx(Model $user) {}

これをオーバーライドしようとして、コピペしたけど、上のエラーが出た。なぜだ。

対処

Modelのパスが異なっていた(useを正しく記述していなかった)

引数の型であるModelが異なるので、オーバーライド出来なかった。
オーバーロードなんてないので、クラスとして正しく記述されていないため、エラーが発生した。

普段は、該当するクラスは無いよとか出るのですが、これはなかなか気づけないよね。

【PHP】クラスをデバッグするReflectionClassとか【767日目】

クラスについて詳しく知りたい

クラス自体をよく知りたい。

このクラスは一体どういう状態なのだろう。
どんな値を持っているのだろう。

テストをしてるときに、正規の方法では取得できないprivateのフィールド値等、今このクラスはどうなってるのかとか。
(めったにそこまでしなきゃいけないことないけど。その時にはクラス構成やテスト考え直すほうが良いけど)

Reflection

PHPには、デバッグとかに使えるリフレクションって機能があります。

公式ドキュメント

https://www.php.net/manual/ja/book.reflection.php

例えばどんなことができる?

定数の定数名とか変数を取得したり、

https://www.php.net/manual/ja/reflectionclass.getconstant.php

privateメソッドを使えるようにしたり、

https://www.php.net/manual/ja/reflectionmethod.setaccessible.php

通常じゃ出来ないことが出来ます。

通常じゃ出来ないことが出来るってことは?

諦めていたテストコードが書けたりとか、諦めてたコードが書けたりするかもしれない。

が、、、通常じゃ出来ないことをすると、様々な前提が壊れるので・・・まあ普通に考えて、普段は使わない方がいいよね/(^o^)\

頭の片隅に置いておくと良さそうな気がします。
もし、普通に現場で使うと良さそうなユースケースとかあったら、教えてくださると嬉しいです!

【PHP】クラスに定義した定数名と値を全て取得したいとき【766日目】

定数を全て確認したい

class Items
{
  const MAX_COUNT = 5;
  const ITEM_NAME = 'Hoge';
}

こんなふうにクラスがあって、

php > var_dump(Items::MAX_COUNT);
int(5)

こんなふうに値が取れる。

でも、『どんな定数名が存在するか』とか、『全部定数がほしい』ってときにどうするか

ReflectionClassとgetConstantsを使う

php > $item = new ReflectionClass(Items::class);
php > var_dump($item->getConstants());
array(2) {
  ["MAX_COUNT"]=>
  int(5)
  ["ITEM_NAME"]=>
  string(4) "Hoge"
}

ReflectionClass経由で、getConstantsを起動すると、このようにキーと値が出てきます。

公式ドキュメント

https://www.php.net/manual/ja/reflectionclass.getconstants.php