- 投稿日:2021-01-01T23:42:05+09:00
PHPをvscode remote containerで開発したかった
はじめLaravel入れていたが、template的に使えるものが欲しかったので作った。
https://github.com/moeyashi/template-php-on-vscode-remote-container
Laravel入れたバージョンも作ろうかなと思います。
2020-01-02 追記
Laravel入れました。勢いあまってlaravel/ui authまで入った。
https://github.com/moeyashi/template-laravel-on-vscode-remote-container
- 投稿日:2021-01-01T22:25:06+09:00
【PHP学習メモ】preg_match 定数の指定
あけましておめでとうございます。
あっという間に2021年ですね。
善き一年になりますように。【今日の学び】
preg_match は、正規表現によるマッチングを行うことができます。【構文】 preg_match ( string $pattern , string $subject [, array &$matches = null [, int $flags = 0 [, int $offset = 0 ]]] ) : int|false引数 $pattern には、検索する文字列を、 $subject には、検索対象の文字列を、[] 部分はオプションで省略可能です。
〜PHPマニュアル〜
https://www.php.net/manual/ja/function.preg-match.php今回学んだのは、検索する文字列に、『定数』を指定する方法です。
・・・省略・・・ // 定数 const THREE_TIMES_RATIO_DAY = 3; const FIVE_TIMES_RATIO_DAY = 5; ・・・省略・・・ if (preg_match ('/' . self::THREE_TIMES_RATIO_DAY . '/' , $date)) { ・・・省略・・・ }このように、連結演算子「.」を使用することで、『定数』を指定することができます。
※同様に『変数』もこの記述方法で指定することができます。日々の学びを少しずつアウトプットしていきます。
間違いなどありましたら、お手数ですが、ご指摘頂けましたら幸いです。
- 投稿日:2021-01-01T22:20:03+09:00
dockerに苦労した話
今回の教材
課題に取り組む前にLaravelのMigrateで沼にハマる
Reset
docker desktop のアンインストール
スタート -> 設定 -> アプリ(ふつーに消えてくれる)
explorerで普通に消そうとするとブルースクリーンが出て再起動になり、永遠に消せない(この時代にブルースクリーンなんて久しぶりに見たわ...)。powershell管理者モードでバチンと消すしか無いらしい
learning-laravel-tddというディレクトリが基準PS C:\WINDOWS\system32> cd D:\OneDrive\dev PS D:\OneDrive\dev> rm -Force learning-laravel-tddDocker Desktop for Windows のインストール
https://hub.docker.com/editions/community/docker-ce-desktop-windows/
インストール自体はすんなりいくDocker 用 git リポジトリのクローン
OneDrive\dev>$ mkdir learning-laravel-tdd $ cd learning-laravel-tdd $ git clone https://github.com/nunulk/learning-laravel-tdd-docker docker $ mkdir app現在の状態
learning-laravel-tdd ├── app └── dockerDockerを起動してからやってね$ cd docker $ cp .env.example .env $ docker-compose up -dPortのかぶりを解決する(DB_PORTを3308に)
僕の場合は 3306 がかぶっていることがわかった(普段pythonで使ってるから)
learning-laravel-tdd\docker\.envCOMPOSE_PROJECT_NAME=learning-laravel-tdd APP_PATH=../app TZ=Asia/Tokyo WEB_PORT=80 - DB_PORT=3306 + DB_PORT=3308 DB_DATABASE=learning_laravel_tdd DB_USERNAME=root DB_PASSWORD=root DB_TESTING_DATABASE=learning_laravel_tdd_testing DB_TESTING_PORT=3307 DB_TESTING_USERNAME=root DB_TESTING_PASSWORD=rootするとDockerのコントロールパネルでstartしたときに全部つく
動作確認
以下のコマンドを実行して、すべてのコンテナが起動しているかどうか確認
learning-laravel-tdd\docker>$ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------------- learning-laravel-tdd_app_1 docker-php-entrypoint php-fpm Up 9000/tcp learning-laravel-tdd_db-testing_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3307->3306/tcp, 33060/tcp learning-laravel-tdd_db_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3308->3306/tcp, 33060/tcp learning-laravel-tdd_web_1 nginx -g daemon off; Up 0.0.0.0:80->80/tcpアプリケーションの初期化
learning-laravel-tdd\docker>$ docker exec -it learning-laravel-tdd_app_1 ash # composer create-project --prefer-dist "laravel/laravel=7.*" .learning-laravel-tdd\app\.env# 中略 LOG_CHANNEL=stack - DB_CONNECTION=mysql - DB_HOST=127.0.0.1 - DB_PORT=3306 - DB_DATABASE=laravel - DB_USERNAME=root - DB_PASSWORD= + DB_CONNECTION=mysql + DB_HOST=db + DB_PORT=3306 + DB_DATABASE=learning_laravel_tdd + DB_USERNAME=root + DB_PASSWORD=root + DB_TESTING_HOST=db-testing + DB_TESTING_PORT=3306 + DB_TESTING_DATABASE=learning_laravel_tdd_testing + DB_TESTING_USERNAME=root + DB_TESTING_PASSWORD=root BROADCAST_DRIVER=log # 中略learning-laravel-tdd\app\config\database.php'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '3306'), + 'port' => env('DB_PORT', '3308'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], + 'mysql_testing' => [ + 'driver' => 'mysql', + 'host' => env('DB_TESTING_HOST', '127.0.0.1'), + 'port' => env('DB_TESTING_PORT', '3307'), + 'database' => env('DB_TESTING_DATABASE', 'forge'), + 'username' => env('DB_TESTING_USERNAME', 'forge'), + 'password' => env('DB_TESTING_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], 'pgsql' => [ 'driver' => 'pgsql', 'url' => env('DATABASE_URL'),learning-laravel-tdd\app\phpunit.xml<server name="CACHE_DRIVER" value="array"/> - <!-- <server name="DB_CONNECTION" value="sqlite"/> --> - <!-- <server name="DB_DATABASE" value=":memory:"/> --> + <server name="DB_CONNECTION" value="mysql_testing"/> + <server name="DB_DATABASE" value="learning_laravel_tdd_testing"/> <server name="MAIL_MAILER" value="array"/>Models ディレクトリの作成と User.php の移動
Laravel は、デフォルトでは Model クラスを artisan コマンドで生成すると app ディレクトリ直下に生成しますが、本教材では、Models ディレクトリを作って、そこに配置していきます。インストールで自動的に作られる User.php をあらかじめ Models ディレクトリに移しておきましょう。
まずは以下のコマンドを実行してディレクトリを作成します(コンテナ側でもホスト側でもどちらでも大丈夫です)。
learning-laravel-tdd\app# mkdir app/Models続いて、app/User.php を app/Models 以下へ移動し、名前空間を変更します。
learning-laravel-tdd\app\Models\User.phpnamespace App\Models;User クラスを参照している箇所の名前空間もあわせて変更します。
変更するのは以下の2つのファイルです。
learning-laravel-tdd\app\config\auth.php'providers' => [ 'users' => [ 'driver' => 'eloquent', - 'model' => App\User::class, + 'model' => App\Models\User::class, ],learning-laravel-tdd\app\database\factories\UserFactory.php- use App\User; + use App\Models\User;config is ignored
learning-laravel-tdd\docker\db\my.cnf
を読み取り専用にする
Windowsだけの問題らしいmysqld: [Warning] World-writable config file '/etc/mysql/my.cnf' is ignored. がでる
[Docker+Windows]mysqlのdockerイメージがmy.cnfのマウントのエラーで起動しない時の対処法アプリケーションの確認
最後に、アプリケーションが動作するか確認するため、コンテナ内で以下のコマンドを実行してください。
/app # php artisan migrate
- 投稿日:2021-01-01T16:24:01+09:00
型宣言についてまとめる
これまでしてこなかった型宣言について
公式の内容を纏めて自分なりに解釈してみました。参考: PHP.net
なぜ型宣言をするのか?
そもそもの型宣言とはなにか?
関数のパラメータや戻り値、 クラスのプロパティ (PHP 7.4.0 以降) に対して型を宣言することができます。 これによって、その値が特定の型であることを保証できます。 その型でない場合は、TypeErrorがスローされます。
自分なりに解釈すると
パラメータや戻り値が定義されていることで求めた型以外が参照された場合に
エラーを返すことによって大きなバグになることを事前に防いでいるのかと考えます。
またバグ出た際の原因追求もしやすくなるのかなと思います。わかりやすく言うと
スーパーとかがイメージしやすいのかなと!
お酒コーナーにはお酒をおいてあるのでそこから持ち出したら
もちろんお酒を持っていくことになりますよね!
お菓子コーナーから商品を持ち出したらそれはもちろんお菓子です。
そのメソッドを使ってどんな反応が返ってくるのか
その範囲、カテゴリを指定することでおおよその返り値を想定することが出来る。
そんなイメージがわかりやすいかなと思います。基本的な型
型 説明 ver クラス/インターフェイスの名前 値が指定したクラスやインターフェイスのインスタンでなければいけません。 self 値がそのメソッドが定義されているクラスと同じクラスのインスタンスでなければいけません。クラスの内部でのみ使えます。 array 値が配列でなければいけません。 callable 値がcallableでなければいけません。クラスのプロパティの型では宣言できません。 bool 値がbool値でなければいけません。 float 値がfloatでなければいけません。 int 値がintでなければいけません。 string 値が文字列でなければいけません。 iterable 値が配列か、Traversableのインスタンスでなければなりません。 PHP 7.1.0以降 object 値がobjectでなければなりません。 PHP 7.2.0以降 mixed 値はあらゆる値であることが出来ます。 PHP 8.0.0以降 ※union型
型をunionとして宣言するとひとつではなく複数の異なる型を値として受け入れることが出来る。
<?php function getItem(): T1|T2... { //返り値はT1|T2となる }※mixed型
mixed型は
array|bool|callable|int|float|object|resource|string|null
と同等の型です。Nullを許容する型宣言
型の名前の前にクエスチョンマークを付けることで
返り値がnullである場合も許容される<?php function getItem(): ?string { //返り値はnull|stringのどちらかである }返り値でのみ有効な型
void
voidは関数が値を返さないことを示す戻り値の型
static
値が、メソッドが呼び出されているクラスと同じインスタンスでなければいけない。
型宣言は完全でもなければ最低限でもない
他の言語のことは知らないのでなんとも言えませんが
型の扱いがゆるいイメージのPHP特有なのか
型宣言をしたからと言って必ずしもその型で扱われているとも限らない
わかりやすい例でコードを書くと<?php function getItem(): int|string { // return true; }上記のコードでは
true = 1
とした扱いになり
intとboolは互換性がありエラーとはならないので
型を定義したのであればしっかりと定義した型で
返してあげるようにしたほうがいいかと思います。
- 投稿日:2021-01-01T16:22:16+09:00
MySQLデータテーブルにPHPで作成したフォームのデータを書き込む
参考
・https://qiita.com/ho-gaku/items/914e80a955b510538377
・https://qiita.com/harufuji/items/d033d3480a0c791973ae手順
前回同様に、
1.データベースに接続
2.接続エラー処理
3.テーブルデータ取得
4.表示処理
5.データベース接続終了新たに、
1.フォーム作成
2.フォームに入力されたデータを受け取ってDBに接続し書き込む。前回のコードサンプル
<?php $link = mysqli_connect('localhost', 'root', '' ,'eccube001'); // ↑host ↑USER ↑PW(空白) ↑DB名前 // 接続状況をチェックします if (mysqli_connect_errno()) { die("データベースに接続できません:" . mysqli_connect_error() . "\n"); }else { echo "データベースの接続に成功しました。\n"; } print "<br>"; // ステータスの一覧を表示する $query = "SELECT * FROM mtb_order_status;"; // ↑まずはサンプルで固定のSQLを入れる(サンプル・動作確認としてこのまま) // クエリを実行します。 if ($result = mysqli_query($link, $query)) { echo "SELECT に成功しました。\n"; print "<br>"; foreach ($result as $row) { var_dump($row); } }else{ echo "SQL実行に失敗しました。\n"; } // 接続を閉じます mysqli_close($link); ?>今回
銀行口座の入出金の機能を最終的に作成するために、今回は銀行口座開設フォームを作成する。
銀行口座に必要な機能
・口座開設フォーム
・入出金を記録、確認できるDBに書き込む
前回と同様に、DBに接続します。そして、フォームに入力されたデータをPOSTで受け取ってDBに接続しinsertで書き込む。
$link = mysqli_connect('localhost', 'root', '' ,'AIBANK'); if (isset($_POST['send']) === true) { $number= htmlspecialchars(trim($_POST["number"])); $type = htmlspecialchars(trim($_POST["type"])); $name_full= htmlspecialchars(trim($_POST["name_full"])); $name_kana = htmlspecialchars(trim($_POST["name_kana"])); print($name_full); $query = "INSERT INTO account_170(number, type, name_full, name_kana, create_date,flg_active) VALUES ('$number','1','$name_full', '$name_kana',CURRENT_TIMESTAMP,'1');"; }ステータスを表示する
テーブルデータを取得、表示しinsertされたデータをここに表示する。
$query = "SELECT * FROM account_170;"; if ($result = mysqli_query($link, $query)) print "<table border=''>"; foreach ($result as $row) { print "<tr>"; print "<td>" . $row["number"] . "</td>"; print "<td>" . $row["type"] . "</td>"; print "<td>" . $row["name_full"] . "</td>"; print "<td>" . $row["name_kana"] . "</td>"; print "<td>" . $row["create_date"] . "</td>"; print "<td>" . $row["flg_active"] . "</td>"; print "</tr>\n"; } print "</table>"; mysqli_close($link); print "<hr>"; ?>入力フォームを作成する
htmlでフォームを作成する
<body> <form action="" method="post"> <h2>口座番号登録フォーム</h2> <p>口座番号 : <input type="text" id="number" name="number" size="60" placeholder="2020112"> </p> <p> 預金種別 : <input type="radio" id="type" name="type" value="1">普通預金 <input type="radio" id="type" name="type" value="2">当座預金 </p> <p> <label>預金者名 : </label> <input type="text" id="name1" name="name1" size="60" placeholder="山田太郎"> </p> <p> 預金者名(かな) : <input type="text" id="name2" name="name2" size="60"placeholder="ヤマダタロウ"> </p> <p><input type="submit" name ="send" value="口座開設を登録する" onclick="clickbtn()"></p> </form> </body>サンプルコード
銀行口座開設フォームが完成
<!DOCTYPE html> <html lang="ja"> <?php $link = mysqli_connect('localhost', 'root', '' ,'AIBANK'); if (isset($_POST['send']) === true) { $number= htmlspecialchars(trim($_POST["number"])); $type = htmlspecialchars(trim($_POST["type"])); $name_full= htmlspecialchars(trim($_POST["name_full"])); $name_kana = htmlspecialchars(trim($_POST["name_kana"])); print($name_full); $query = "INSERT INTO account_170(number, type, name_full, name_kana, create_date,flg_active) VALUES ('$number','1','$name_full', '$name_kana',CURRENT_TIMESTAMP,'1');"; } if ($result = mysqli_query($link, $query)) { echo "成功しました。\n"; print "<br>"; }else{ echo "失敗しました。\n"; print "<br>"; } $query = "SELECT * FROM account_170;"; if ($result = mysqli_query($link, $query)) print "<table border=''>"; foreach ($result as $row) { print "<tr>"; print "<td>" . $row["number"] . "</td>"; print "<td>" . $row["type"] . "</td>"; print "<td>" . $row["name_full"] . "</td>"; print "<td>" . $row["name_kana"] . "</td>"; print "<td>" . $row["create_date"] . "</td>"; print "<td>" . $row["flg_active"] . "</td>"; print "</tr>\n"; } print "</table>"; mysqli_close($link); print "<hr>"; ?> <body> <form action="" method="post"> <h2>口座番号登録フォーム</h2> <p>口座番号 : <input type="text" id="number" name="number" size="60" placeholder="2020112"> </p> <p> 預金種別 : <input type="radio" id="type" name="type" value="1">普通預金 <input type="radio" id="type" name="type" value="2">当座預金 </p> <p> <label>預金者名 : </label> <input type="text" id="name1" name="name1" size="60" placeholder="山田太郎"> </p> <p> 預金者名(かな) : <input type="text" id="name2" name="name2" size="60"placeholder="ヤマダタロウ"> </p> <p><input type="submit" name ="send" value="口座開設を登録する" onclick="clickbtn()"></p> </form> </body> </html>
- 投稿日:2021-01-01T12:06:45+09:00
laravel MySQL tinyInteger型のカラムはchangeできない
目的
- マイグレーションファイルを用いてTinyInt型のカラム情報を変更しようとしたけどエラーが出たのでまとめる
情報
- 今回の事例はすでに作成されているTinyInt型カラムのコメントを変更しようとした。
エラーまでの経緯
マイグレーションファイルのup側に下記のように記載してカラムのコメントを変更しようとした。
$table->tinyInteger('カラム名')->comment('変更後のコメント')->change();下記コマンドを実行してマイグレーションを実行した。
$ php artisan migrateエラー
下記のエラーが出力された。
Unknown column type "tinyinteger" requested. Any Doctrine type that you use has to be registered with \Doctrine\DBAL\Types\Type::addType(). You can get a list of all the known types with \Doctrine\DBAL\Types\Type::getTypesMap(). If this error occurs during database introspection then you might have forgotten to register all database types for a Doctrine Type. Use AbstractPlatform#registerDoctrineTypeMapping() or have your custom types implement Type#getMappedDatabaseTypes(). If the type name is empty you might have a problem with the cache or forgot some mapping information.原因
公式ドキュメントにこんな記載を発見した。https://readouble.com/laravel/6.x/ja/migrations.html
Note: 以降のカラムタイプのみ変更可能です:bigInteger、binary、boolean、date、dateTime、dateTimeTz、decimal、integer、json、longText、mediumText、smallInteger、string、text、time、unsignedBigInteger、unsignedInteger and unsignedSmallIntegerこのドキュメントによるとTinyIntegerはchangeメソッドを用いた変更をする事ができない。
解決までの経緯
- 下記の方法を用いてTinyIntegerのカラムの内容を修正した。
- 投稿日:2021-01-01T03:05:18+09:00
Docker環境でDBに接続するとcould not find driverが出たときの対処方法
DBに接続する処理を作成
<?php define('DB_NAME', 'データベース名'); define('USER_NAME', 'ユーザー名'); define('USER_PASS', 'パスワード'); try { $pdo = new PDO( DB_NAME, USER_NAME, USER_PASS, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_EMULATE_PREPARES => false ] ); } catch (PDOException $e) { echo $e->getMessage(); exit; }接続すると下記のエラーが出力された
could not find driverドライバが見つからないようなので現在のドライバを確認してみる
php -m | grep pdo # pdo_sqlitepdo_mysqlがインストールされていないのが原因らしいのでDockerFileに処理を追加する
FROM php:7.2-fpm COPY php.ini /usr/local/etc/php/ # 追加 RUN docker-php-ext-install pdo_mysql再度ビルドすると無事に接続できた!
- 投稿日:2021-01-01T00:37:35+09:00
【Laravel】結局どう違うの?Eloquent, DBクラス, クエリビルダ 前編
困りごと
PHP歴3ヶ月、Laravel歴1ヶ月の初学者です。LaravelのDBの操作方法は
Eloquent ORM・DBクラス・クエリビルダ
に分類されます。表示されればなんでもOKというからレベルを一段階上げていきたい初学者がこれらの違いについてまとめました。前編:各記述法の違いについて。(今回)
後編:どのように記述法を選択していくのか(次回)開発環境
PHP 7.2.34 / Laravel 6.20.5
記述法を比較
①DBファザードは
Illuminate\Support\Facades\DB
クラスによる記述法。
②Eloquent ORMはIlluminate\Database\Eloquent\Model
クラスを継承する記述法。
それぞれ見ていきます。①DBクラスの記述 (DBファザード)
DBクラスによる記述のため
Illuminate\Support\Facades\DB
をuseする。Controller.phpuse Illuminate\Support\Facades\DB;⭐️ DBファザード パターン①
DB::SQL値(SQL文、パラメータ配列)
のように引数に直接SQL文を用いて記述する。
SQL値にはinsertやupdateなどの基本的なSQLのメソッドは揃っている。記述例
controller.phppublic function query(Request $request) { //SELECT文 $items = DB::select('select * form users where id = ?',[1]); //INSERT文 DB::insert('insert into users (id, name) values (?,?)',[1,'たかし']); //UPDATE文 DB::update('update users set age = 100 where id = ?, [2]'); //DELETE文 DB::delete('delete from users'); }Laravel公式リファレンス(DBファザード)
https://readouble.com/laravel/5.dev/ja/database.html⭐️ DBファザード パターン②
SQL文を生成するためのメソッドをメソッドチェーンで記述することによりデータベースを操作する。
DB::table('テーブル名')->メソッド()
のように記述する。記述例
・usersテーブルから、フィールド名(id)とパラメータ(requestされたid)が同じレコードを取得Controller.phppublic function select(Request $request) { $items = DB::table('users')->where('id',$request->id)->first(); return view('index',['items' => $items]); } //DB::table('テーブル名')->where('フィールド名',パラメータ)->first()・usersテーブルの内容をリクエストされた値へ変更(フィールド名とパラメータが同じレコードに対しての処理)
Controller.phppublic function update(request $request) { $param = [ 'id' => $request->id, 'name' => $request->name, 'comment' => $request->commment, ]; DB::table('users')->where('id',$request->id)->update($param); } //DB::table('テーブル名')->where('フィール名',パラメータ)->update(パラメータ);Laravel公式リファレンス(クエリビルダ)
https://readouble.com/laravel/5.dev/ja/queries.htmlまた、クエリの中で直接SQLを使用したい場合は
DB::raw
メソッドを使用する。Countroller.php$users = DB::table('users') ->select(DB::raw('count(*) as count, status')) ->where('status','<>',1) ->groupBy('status') ->get();参考:https://readouble.com/laravel/5.7/ja/queries.html
余談ですが、
DBファサードでの insert もしくは update では created_at や updated_at は更新されません。
Eloquent を利用したときのみです。とのことです。私はこれが原因で値が保存されずにハマったことがあります。
参考:https://laraweb.net/knowledge/2347/②Modelクラスの記述 (Eloquent ORM)
※Eloquent ORMの基本の考え方 例:usersテーブル
①1つのクラスがDBの1テーブルに対応
$users = User::all()
②クラスの1インスタンス(オブジェクト)は、DBの1レコードに対応$user = new User()
③クラスの属性は、テーブルの各カラムに対応{{$user->comment}}
⭐️ Eloquent ORM
モデルクラスによる記述のため
App\Model名
をuseする。Controller.phpuse App\Models\User; //Modelsディレクトリの配下にUserモデルを生成。記述例
・usersテーブルの全ての値を、Collection型として取得してview(index)へ渡すController.phppublic function select(Request $request) { $item = User::all(); return view('index',['items' => $items]); }・usersテーブル内でリクエストされたnameフィールドと同じ値のレコードを、Collection型として取得しview(index)へ渡す。
Controller.phppublic function search($Request $request) { $item = User::where($request->name)->get(); //クラス名::where(検索する値')->取得方法 return view('index',['items' => $items]); }参考:
https://blog.ytake.jp.net/entry/2015/12/16/011812
https://qiita.com/gone0021/items/f1e8223c94dbaab22fca最後に
書き方の違いについてざっくりまとめました。書き方が多くあるが故に、僕のような初学者は選択に困ってしまう部分だと思います。理解がより深まるようにメリデメについてまとめたかったのですが、長くなってきたので後編に書きます。
この内容は奥が深いようなので、実務経験を元にさらにブラッシュアップしていきます。
(本内容に誤りがありましたらご指摘いただけると幸いです。)