PHP 継承する際にプロパティの記載を強制する方法 abstractは使えない

疑問

やりたかったこと

抽象クラスとその子クラスがある。子クラスで定数の実装を忘れないためにabstractで記述しておきたい。

abstract class 抽象クラス
{
    abstract const HOGE;
}

class 子クラス extends 抽象クラス
{
   const HOGE = 'hoge';
}

しかし、これではエラーが出てしまう。

調査

  • php abstract プロパティ」でググった。
  • 結論、できないとのこと。
  • 代わりの方法はあるか?

わかったこと

  • プロパティは宣言したら値を入れなければならない。
  • 関数は宣言しても空でいいので抽象化することができる。
  • 下記のようにset関数とconstractを使って未記入を防ぐ
abstract class Father 
{
  public $name;
  abstract protected function setName(); // now every child class must declare this 
                                      // function and thus declare the property

  public function __construct() 
  {
    $this->setName();
  }
}

class Son extends Father
{
  protected function setName()
  {
    $this->name = "son";
  }

  function __construct(){
    parent::__construct();
  }
}

参考

PHP 即時関数について (function(){})() なんじゃこりゃ

疑問

やりたかったこと

defin()を使って定数LEVEL に1~99までを格納しようと考えた。 1~100まで記入するのは面倒だったので、for文で回そうと考え、以下のように実行できないか考えた。

defin(
  'LEVEL',
  function(){
     $level = [];
     for($i=1;$i<100;$i++){
         $level[] = $i ;
     }
    return $level;
  }
)

しかし、これではLEVELに関数がそのまま格納されてしまう。 私がほしいのは、実行結果を入れたいのである。

調査

  • 「無名関数 実行」でググった。
  • php (無名関数)()」でググった。
  • PHP 即時実行関数」でググった。

「無名関数 実行」でググった際に、 phpの公式ドキュメントの例で(function(){処理})() と書いているのを発見。

「即時実行」というキーワードで検索したら良さそうだと気づき、検索。

わかったこと

  • 無名関数をその場で実行する場合、それは即時実行関数という。
  • (無名関数)()の形で書ける。
  • JavaScriptではよく使う手法とのこと。
  • 即時実行関数は名前空間を汚さずに関数を使いたいとき便利とのこと
  • 以下に訂正したコードを記載
defin(
  'LEVEL',
  (function(){
     $level = [];
     for($i=1;$i<100;$i++){
         $level[] = $i ;
     }
    return $level;
  })()
)

私が期待した処理はこれでできました!

参考

マークダウンでメモができるようになりたい

やりたいこと

  • マークダウンでメモを取れるようになりたい。
  • 技術ブログでよくみるコードが書いてあるやつ。
  • メモははてなブログに書いていく。

調査

  • 「マークダウン記法」でググった。

マークダウンの書き方

  • #見出し1 ##見出し2 ###見出し3 見出し
  • **太字** 太字になる 
  • *斜体* 斜体になる
  • ~~訂正線~~ 訂正線
  • `マーカー` マーカーが引ける
  • [表示テキスト](URL) リンク
  • >引用 引用になる

参考

【GitとGitHub】branchの基本とissuesと紐付けた命名 issuesの書き方も

branchとは

branchは並行して複数機能を開発するためにあるのがbranchです。

追加する機能ごとにbranchを作成します。

そうすることで、branchごとにワークツリーからリモートリポジトリを個別に管理することができます。

それの何が嬉しいかというと、同時に変更を加える中で他の変更の影響を受けないということです。

 

branchのチーム開発での利用

チーム開発をしていく上でbranchが有効であることをお話ししました。

さらにbranchの名前に対して決まった役割を定めておくことで

よりスムーズに開発を進めていくことができます。

以下に名前と役割を記載します。

  • master 公開するものを置く
  • develop 開発中のものを置く
  • relese 次にリリースするものを置く
  • feature/* 新機能開発中に使う
  • hotfix/* 公開中のもののバグ修正用に使う

例えば、公開中のサービスがあったとして

そのファイルはmasterに置かれています。

その状態から、

「バージョンアップさせよう!」

次のバージョンでは

「機能Aと機能Bを追加しよう」

となったとします。

そのとき開発のためのbranch作成の流れとしては

masterからdevelopを派生させます。

そしてdevelopから機能Aと機能Bを作成するための

ブランチをそれぞれfeature/#12functionA、feature/#13functionB

といったふうに作成します。(#番号については後ほど解説)

 

ブランチの作成から削除までのライフサイクル

上記に引き続き、機能Aを追加したいという状況になったとします。

そのときの機能Aが追加されるまでの流れを記載します。

  1. GitHub上でissueを作成 
  2. 自分のローカル環境でbranchの作成
  3. リモートbranchの作成 
  4. 開発
  5. featureブランチ(今開発にしようしているブランチ)に push
  6.  pull request
  7. develop にmerge
  8. ローカルのfeatureブランチの削除
  9. リモートのfeatureブランチの削除

それぞれの実行方法

  1. 別記事URL
  2. git checkout -b ブランチ名
  3. git push origin ブランチ名
  4. 開発
  5. git push origin ブランチ名
  6. 別記事url
  7. GitHub上のpull requestから「Merge pull request」
  8. 別のブランチからgit branch -d ブランチ名
  9. git push --delete origin ブランチ名 

 

branch関連の基本コマンド

ここではbranchの作成などの基本的なコマンドを列挙していきたいと思います。

  • git branch -a  今作成されているbranchが表示されます。-aがあることで追跡ブランチも表示されます。
  • git branch ブランチ名 新しいbranchが作成されます。
  • git checkout ブランチ名 branchの切り替え
  • git checkout -b ブランチ名 新しいbranchの作成と切り替えを一度にできる。
  • git branch -d ブランチ名 ブランチの削除
  • git push -u リモート名 ブランチ名  ローカルの環境にリモートを合わせる。git branch -dでブランチを削除した後にpushするとリモートブランチと追跡ブランチの両方も削除できる。
  • git fech  一個上の逆でリモートの環境にローカルを合わせることができる。

 

【GitとGitHab】基本的なコマンド

前回の記事で3/1~3/31に学習したことをカテゴリ分けいたしました。

その中にGitとGitHubについて学習したことを記載しましたが、

今回は具体的な学習内容についてまとめたいと思います。

※前回記事

【独学エンジニア】2022年3/1~3/31で勉強したことのカテゴリ分け - m1tamaのブログ

 

基本的なGitの仕組み

GitとGitHubとは何か?

Gitというのはファイルのバージョンを管理するためのツールです。

そのGitを用いて、チーム開発においてさらにバージョン管理を容易に

するためのツールがGitHubです。

GitHubについてもう少しちゃんというと、

gitのコードをオンライン上で扱うためのツールです。

 

Gitのデータ保存の方法 --差分ではなくスナップショット

Gitはデータを差分ではなくスナップショットを記録しています。

デート以前との差分で保存するのではなく、

データ丸々保存することによって、

複数人で開発する場合などでそれぞれで作成したものを

瞬時に統合することができます。

また、以前のバージョンに戻すことも容易です。

 

GitとGitHubへの保存の段階

まずGitはローカルで利用するものです。

それをGitHubを使ってリモートに上げます。

 

Gitではローカルでどんなことが行われているか

もう少し話すと

ワークツリーのデータをローカルリポジトリに記録していきます。

このローカルリポジトリの記録を元にバージョンの復元などが行われます。

 

Gitでは今話した、ワークツリーとローカルリポジトリ

の間にステージというエリアがあります。

 

Gitでは「ワークツリー」「ステージ」「ローカルリポジトリ

という3つのエリアをイメージすることが大切です。

 

ワークツリーが手元の作業場ですね。

その作業で変更したファイルをまず「ステージ」に記録します。

ローカルリポジトリに上げる前の準備だと思ってください。

 

そして、変更がひと段落し

「よしこれで次のバージョンとするぞ」

というタイミングで「ローカルリポジトリ」へ

スナップショットを保存します。

 

ステージの存在理由をもう少し補足すると

ファイルAとファイルBを並行して編集していたとして

ファイルAは変更が完了しファイルBは変更が未完了だとします。

 

このときファイルBは変更前の状態で

ファイルAは変更した状態を次のバージョンとしたいとき、

ファイルAだけを「ステージ」に上げると

「ステージ」ではまだファイルBは変更されていないことになります。

その状態で「ローカルリポジトリ」にスナップショットを保存するわけです。

よくできています。

 

そして、そのローカルリポジトリに保存した内容で

「問題ないでしょうか?あれば教えてください」

とお伺いを立てたり

「問題なければ、自分のワークツリーに取り込んでねー!」

とデータを共有するために

GitHubの「リモートリポジトリ」に「ローカルリポジトリ

の内容をアップします。

 

基本的なコマンド

ここではGitで使うコマンドを列挙していきたいと思います。

詳しい内容は割愛します。

ローカルでの操作
  • git init .git/が作成される。gitで必要なファイルが保存される。例えばcommitしたときのスナップショットや設定ファイルなど
  • git clone リモートリポジトリ名 すでにリモートリポジトリ上にあるプロジェクトをコピーする。ファイルと.git/が保存される。
  • git add ファイル名
  • git commit -m "コミットメッセージ"
  • git status  変更されたファイルを確認できる
  • git diff addする前の差分を確認
  • git diff --staged ステージとリポジトリの差分を確認
  • git log 変更履歴を確認
リモートリポジトリとの操作
  • git remote add origin リモートリポジトリのURL リモリポジトリの登録
  • git push origin ブランチ名 プッシュ  
  • git fech リモート名 ブランチ名 リモートからローカルリポジトリに落とす。追跡ブランチに保存される
  • git merge 追跡ブランチからワークツリーに落とす。
  • git pull fechとmergeを一気にやる

基本的な機能としてbranchというものもあります。

branchについてはissuesと紐付けて行う

branch作成についても記述してたく、

少し長くなるので別記事に記載いたします。

 

各段階での注意点や補足

ちゃんと確認しよう git status git diff

個人で開発を行う場合は、そこまで必要ないように

思えるが、チーム開発でアップすべきではないファイルまで

コミットしてしまうとチームに迷惑がかかってしまう。

そうならないために、git statusでcommitする前に

確認する癖をつけよう!

commitメーセージ

commitする際に記載するメッセージですが、

メッセージの書き方のスタンダードを記載します。

1行目 変更点

2行目 空行

3行目 変更した理由

 

個人で開発するなど簡単に書くときは

1行目に変更点と変更した理由を書くこともあります。

 

fech+merge と pull の使い分け

pullはfechとmergeをいっぺんにやってしまうことで、

思わぬ挙動をすることがあるので注意です。

 

例えば、ローカルリポジトリの方でmasterとhogeというブランチ

があったとします。

自分がmasterで操作しているとして、

masterのリモートブランチからpullしたいのに

間違ってgit pull origin hoge を実行したとします。

このとき

hogeブランチの方にpullしてくれたらいいのですが

残念ながらhogeの内容でmasterを上書きすることになります。

 

 

 

 

 

【独学エンジニア】2022年3/1~3/31で勉強したことのカテゴリ分け

【独学エンジニア】2022年3/1~3/31で勉強したことのカテゴリ分け

こんにちは、tamaです。

今日は前回の続きです。

前回の 2022年3/1~3/31の学習を振り返る - m1tamaのブログ

でもお話ししました、山浦清透さんが行なっているサービスの「独学エンジニア」をスタートさせました。

1ヶ月の勉強期間ですが、たくさんのことが学べたと思います。

 

学べたと言っても、

現時点では「経験できた」といったレベルかと思います。

ここから「体に染み込ませる」ぐらいまでやりたいわけですが、

その前にここらで学習のまとめを行なっておきたいと思います。

 

4月からは学んだことを活かしてガンガン自作していきたいのですが、

忘れてることも出てくるでしょう。

そのときに先効率良く振り返りができるようにまとめておきます。

 

2022年3月で独学エンジニアで学んだこと5つ

Linuxコマンド

Linuxの基本コマンドを学習しました。

本当に基本的なところなので現在使っている

MacOSでも使えるコマンドばかりです。

普段の操作からコマンドの入力に慣れていきたいと思いますが、

ついついGUI(マウスを使う、などのグラフィカルな操作)

に頼ってしまいます。

矯正いたします!

【Linuxコマンド】3/1~3/31に学習したものまとめ - m1tamaのブログ

gitとgithab

gitとgithabでは基本的な操作を学びました。

gitでは常にワークツリー、ステージ、ローカルリポジトリをイメージすることが大切です。それぞれがどういう意味なのかとより詳しいgitとgithabの使い方は

また、別の記事で記載いたします。

 

基本的な使い方に加えて、チーム開発で役立つであろう

Pullリクエストの書き方やisuuesの使い方、branchの命名の仕方を

調べたので、そちらについても記載したいと思います。

Docker

こちらは今のところ、

山浦清透さんが準備してくれた環境を実行してみたという段階ですね。

「独学エンジニア」では後に実際にDockerで環境構築

できるようになるためのステップが用意されているようです。

 

とりあえず、今の段階でDockerとは何か理解していることを

記載したいと思います。

あと、具体的な使い方も!

データベース(DB) SQL

SQLはProgateで基礎的なことはやっており、

「表の作成」「表の削除」「データの追加」「データの読み出し」

は重なるところでした。

ただ、webアプリにDBを利用するというのは新たに学ぶ内容でした。

 

それはPHPのコードの中で使用するので、

SQL単体の話というより、PHPでどのようにDBを使うのかというのを

記載したいと思います。

PHP

こちらも、「if文や変数、関数」などProgateでやっていた内容と重なる

部分が多かったです。

実践的に活用していく中で、新たに学ことも多かったので

そちらを記載していきたいと思います。

 

 

【Linuxコマンド】3/1~3/31に学習したものまとめ

前回の記事で3/1~3/31に学習したことをカテゴリ分けいたしました。

その中にLinuxについて学習したことを記載しましたが、

今回は具体的な学習内容についてまとめたいと思います。

※前回記事

【独学エンジニア】2022年3/1~3/31で勉強したことのカテゴリ分け - m1tamaのブログ

 

Linuxの歴史も面白かったのですが、本日はそこは割愛させていただき

覚えておくべきコマンドを列挙したいと思います。

 

基本的なLinuxコマンド

  • cd パス ディレクトリの移動 cd(chenge directory)
  • pwd 今いるディレクトリのパスの表示 pwd(print working directoly)

  • ls ディレクトリ内の確認 ls(list)  ls *.html でhtmlファイルのみを出力してくれる
  • mkdir ファイル名 ディレクトリ作成 mkdir(make directory) -pで親ディレクトリも一緒に作れる。
  • rmdir 空のディレクトリを削除 rmdir(remove directory) 
  • rm ファイルの削除 -rディレクトリ削除 (※ゴミ箱にいかず完全に削除するので注意)
  • cat ファイルパス ファイルの中身を確認
  • touch ファイル名 空ファイルの作成orタイムスタンプ
  • mv 移動元 移動先 ファイルの移動 ファイル名の変更