時間がくねくねしてなくてよかった

答えは人それぞれですが、何かを考えるきっかけになるようなブログを目指してます

【PHP】基本の学習まとめ(備忘録)

PHPで学んだ基本についての備忘録を共有したい。配列、Foreach文、コロン文、関数、戻り値、クラス、インスタンス、コントラクタ、アクセス権、Static、継承、Override、抽象化、インターフェースなどについて記述した。

 

f:id:yojiro_s:20181130184356p:plain

 

 

 

基本的な名称など

ビルトインサーバー

PHPに備わっている簡易的に使えるWebサーバーのこと。ローカル開発環境において、コマンド一発で簡単にWebサーバーに接続して、動作確認ができるというもの。

接続するには、接続しようとしているローカル開発環境のIPアドレスが必要なので、ターミナルで「ip a」とコマンドを打つとIPアドレスが出てくるので、確認する。ビルトインサーバーの立ち上げは

「php -S IPアドレス:8000」

と、小文字の「php」とハイフン、そのあとの「S」は大文字で、それに続けてIPアドレス、そしてポート番号をつける。それでビルトインサーバーが立ち上がる。停止するには「control+C」。「http」から始まるアドレスがsターミナル上に表示されるので、それをブラウザにコピーすれば動作確認ができる。

 

定数の付け方

定数は変数と違い、変更しない値を固定するために使用するもの。定義するとその後に新しい値をつけようとしてもエラーになって出来ない。

「define("NAME_NUMBER_ONE", "suzuki");」

といったように、左に定数名(大文字で書くのが通常)を書き、右に値を入力する。「define」は定義するという意味の英語だから覚えやすい。変数とは違って「$」マークはつかない。

 

代入演算子 

①$a = $a + 1;

②$a += 1;

二つの式の意味は同じ。

「+=」となっている②の式も「$a + 1」を$aに代入するという意味になる。「+」だけでなく「-」「*」「/」にも使える。

 

特殊文字

「\n」は改行

「 \」はタブ

 

文字列

PHPで文字列を表示する時は

「""」

「''」

の2種類のクオーテーションを使う。

ダブルクオーテーションは変数と特殊文字を適用させる。シングルクオーテーションは「\n」などの特殊文字でもそのまま「\n」という文字で表示する。

 

変数は波カッコで囲える

文字列の中に変数が混じっていると紛らわしかったりするので、変数は波カッコで囲うことができる。

{$animal}

${animal}

といった具合に全てを囲むのも、ドルマークだけ囲うこともできる。

 

比較演算子

「==」は値が等しい

「===」は値とデータの型も等しい

「!=」は値が等しくない

「!==」は値も型も等しくない

 

論理演算子

「and」「&&」は「〜かつ」と使える。

「or」「||」は「〜か」で使える。

「!」は否定で使える。

 

trueとfalse

どのような場合に「true」と判定され、どのような場合に「false」と判定されるか見てみる。

「false」は文字列が「空」か「0」、数値が「0」、配列の要素がなかった場合、「null」の時などの場合に判定される。それ以外は「true」となる。

 

三項演算子

三項演算子は、条件式の「true」「false」の結果によって、異なる式の結果を返す演算子。

$test = ($a > $b) ? $a : $b;

という式で考えてみる。

https://i.gyazo.com/adddc7cb5ea79b4ce7fcb5c2bc7e8b4a.png

条件式が「true」であれば、赤字の「true」が適用されて「$test」には「$a」が代入される。条件式が「false」であれば「false」が適用されて「$test」には「$b」が代入される。

つまり

$a=2, $b=4

ならば「false」と判定されて「$test」には「$b」が代入されるということ。

 

基本構文と関数 

Switchによる条件分岐

「if」と同じように条件分岐だが、変数の取り得るパターンがすでに決まっている場合にコードを綺麗に書くときなどに使うと便利。各条件は「case」で開始して「break」で閉じる。条件に当てはまらないのは「default」として、やはりその時のアクションを定義してあげる。例えば以下のようになる。

$time = "morning"

switch ($time){

  case "morning":

    echo "good morning!!";

    break;

case "daytime":

case "early evening":

    echo "good afternoon!!";

    break;

case "night":

    echo "good evening!!";

    break;

  default:

    echo "(sleeping...)";

    break;

}

一つの条件で「case」は赤字のように複数定義できる。

 

ループ処理

While文

「〜である間」指定した処理を続けると覚えるといい。先に判定して「true」であれば処理が実行される。変数の初期化、処理が終わる条件、処理を書いていく。

Do While文

処理が先に来て、それからWhileによって判定される式。あと判定なので少なくとも一回は処理される。変数の初期化、処理、処理が終わる条件を書いていく。

For文

While文と同じような役割だが、繰り返す回数がわかっているときなど単純な反復処理のときなどに使われるよう。

Break文

ループを途中で中断して抜ける処理になる。「if」などを使い「〜の場合にはループを抜ける」といったように処理をコントロールできる。

Continue文

「continue」文の後の処理を実行しないで、次のループに移る時に使う。やはり「if」などで条件を指定して使うよう。

 

配列

変数には値を一つしか格納できないが、二つ以上の情報をまとめて管理したい時には配列を使う。一つの箱に複数の値を格納できるというイメージ。

$salary = array(

  "suzuki" => 20,

  "sato" => 30,

  "tanaka" => 40,

);

もしくは「array」の代わりに[ ]を使って

$salary = [

  "suzuki" => 20,

  "sato" => 30,

  "tanaka" => 40,

];

とすることもできる。値を取り出すときは、

echo $salary["suzuki"];

とすると「suzuki」さんの給料が「40」といったように表示される。

値を書き換えることもでき、

$salary["sato"] = 50;

とすれば「sato」さんの給料は50に変更される。

配列はデフォルトでゼロから番号が割り当てられるので、

$salary = [

  20,

  30,

  40,

];

のようにすると、連番[0]の人が20、[1]の人が[30]、[2]の人が[40]といったようにデータが格納される。

echo $salary[0];

と[0]番が割り当てられた人の給料を知りたいとすると、「20」が表示される。

 

Foreach文

配列の中身をループで取り出す処理。「$salary」の中身をなくなるまで引っ張り出してくれる。

$salary = [

  "suzuki" => 20,

  "sato" => 30,

  "tanaka" => 40,

];

例えばこのように定義していたなら、

foreach ($salary as $name => $amount) {

  echo"($name) $amount";

}

とすると、「"suzuki"」などの値を「$name」という変数に入れて、「20」などの値を「$amount」という変数に入れて、処理を実行(この場合はecho)してください、という事になる。

この場合は、

(suzuki)20(sato)30(tanaka)40

と表示される。

また、

$salary = [

  20,

  30,

  40,

];

と定義していたら、

foreach ($salary as $amount) {

  echo "$amount  ";

}

と取り出す命令を書くことで、

20  30  40

と表示される。

 

コロン文

foreach文の波カッコを「:」で代用する式。波カッコが取れることで、すっきりとした構文にすることができる。

foreach ($salary as $amount) {

  echo "$amount  ";

}

のforeach文を、

foreach ($salary as $amount) :

  echo "$amount  ";

endforeach;

と違う書き方で同じ命令を出すことができる。最後に「endforeach」をつける。

 

関数

よく使う処理なんかを登録しておいて、呼び出して使うことができる処理。

function kyuuryou_keisan( ) {

  echo 1*20;

}

と給料の計算方法を「kyuuryou_keisan_sato」という関数名に格納してみる。1日1万円を30日で30万円と計算している。処理は波カッコの後。この関数を呼び出すには、

kyuuryou_keisan( );

と書く。当然「30」と表示される。

また、値に引数を渡す処理をした状態で関数を作り、引数を指定して関数を呼び出すと、

function kyuuryou_keisan($name ) {

  echo $name . "さんの給料は" . 1*30 . "です";

}

kyuuryou_keisan("sato");

などと書ける。関数の定義の時に指定した変数「$name」は、関数の中で使用することができる。関数を呼び出す時に「"sato"」といった引数を渡してあげる。呼び出し結果は、

satoさんの給料は30です

となる。

また、引数に初期値を指定することもできる。

function kyuuryou_keisan($name = "suzuki" ) {

  echo $name . "さんの給料は" . 1*30 . "です";

}

kyuuryou_keisan( );

となり、引数が空欄で呼び出されているので、「"suzuki"」が「$name」に代入される。

 

戻り値

「return」という処理によって返される値のことを「戻り値」という。

「return」は関数内に存在すると、その「return」に到達した時点で、その関数の処理を停止させて、関数の値を返す処理を行うという命令のこと。

 

https://i.gyazo.com/e2537857f6b029fd8279aa20fd3e5aef.png

「function」は関数を作るための命令。

「kakezan」は今回私が作った関数の関数名。

「$num」は引数を受けるための変数。

「echo」の後の「3」が変数に渡す引数。

 

この実行結果は「9」になる。

 

今回の引数「3」をおにぎりの具で例えて梅干しとすると、出来上がる梅おにぎりが戻り値となる。その完成した梅おにぎり(戻り値)を関数に返す命令が「return」となる。

 

https://i.gyazo.com/43801d1fc21521412f457e8c552b6fe0.png

今度の実行結果は「36」になる。今回は引数を「3」の代わりに「6」にした。

 

https://i.gyazo.com/75d5a337dae1f1d8097bf213977fe835.png

赤字の1番の流れで「6」という引数(鮭)を関数(弁当屋で働く職人)に渡して、その「6」という引数(鮭)を使って2番の流れで実行式(ご飯)に混ぜて使うことで戻り値(鮭おにぎり)が完成して処理(調理)が終了し、3番の流れで関数(弁当屋)に戻ってくる、といったようなイメージ。

 

オブジェクト指向

概念

クラスはあらかじめ関数など処理が用意されている「金型」と覚える。その便利な「金型」に名前をつけて使ったりする。クラス内には「プロパティ」と呼ばれる「その金型の特徴」と、「メソッド」と呼ばれる「できること」、という考え方がある。プロパティはクラス内の「変数」であり、メソッドはクラス内の「関数」である。そのクラスという便利な金型には当然特徴があって、何ができるかもその金型によって違うということだ。その便利な金型をコピーして物を作っていくことを「インスタンスを生成する」というように表現する。インスタンスとは「実体」「実例」「事例」といった意味だ。クラスが「金型」や「設計図」であるならば、インスタンスはその「実体」とでも表現できる。一方、オブジェクトは「モノ」や「事柄」を指す言葉。だから「金型である」クラスも、その「実体」であるインスタンスもオブジェクトとなる。しかし、全てのインスタンスはクラスから作られるので、インスタンスされたものをオブジェクトと呼んでいる。クラスは金型でしかないので、それ自体を使うことはできないので、コピーして使う必要がある。まずは金型であるクラスを作ってから、それをベースにしてインスタンス化することで、オブジェクトを作っていく。

 

オブジェクト指向の理解を助ける用語

オブジェクト指向を理解する上で、知っておく必要がある用語をまとめたので備忘録として載せる。

 

オブジェクト指向プログラミング(OOP)

オブジェクト指向を利用するのは楽に開発を進めるため。ソフトウェアを再利用しやすくする技術。部品の独立性を考えることで、エラーの特定や、修正もしやすく、個々を組み合わせて全体を機能させるという考え方。

 

クラスライブラリ

ソフトウェアの再利用部品群

 

フレームワーク

ソフトウェアの再利用部品群

 

デザインパターン

再利用部品群を作る時に用いられるおきまりの設計パターン

 

UML(Unified Modeling Language)

統一モデリング言語。OOPの仕組みを使うソフトウェア構造を図で表したもの。

 

上流工程

業務分析、要求定義、設計といった初期の段階

 

モデリング

OOPを上流工程に応用すること

 

クラス

Object(モノ)の種類を指す。インスタンスを生成するのに必要な「金型」。変数と関数により独立性の高い部品を作る金型。部品を作るためのものだが、できるかぎり大きな部品を作り、簡単に製品(プログラム)を作ることを念頭に置かれている。大きな部品でシンプルに大量生産するための仕組み。バラバラの関数と変数を整理整頓するためのもの。「private」「public」などでアクセスの範囲を指定できる。

 

ポリモーフィズム

英語で多形、多型という意味。命令先が、どのクラスのインスタンスかを意識しないで命令を送れる仕組みのこと。同じ一つの命令で、異なる複数のインスタンスに動作させることができる。例えば、「進め」と命令した時に、「人間クラス」なら歩くし、「車クラス」ならエンジンで進む、といったように同じ命令で全く異なる性質のものに命令を送れる。「人間クラス」と「車クラス」は違うクラスだけど、同じ「進め」というメソッドで、それぞれ異なった動きをさせることができる。クラスはインスタンスを生成して、そのインスタンスに共通の機能を効率的に分散させるが、ポリモーフィズムは、複数のクラスから生成された複数のインスタンス同士共通の関数とも言える。コードの重複を避けることができる。コードの無駄を減らせる。

ポリモーフィズム | PHPの練習

このページがとても参考になった。

 

継承

クラスの特徴を引き継ぐこと。クラス同士の共通点と、相違点を整理することができる。コードの重複を避けることができる。コードの無駄を減らせる。

 

スーパークラス

哺乳類や爬虫類が集まった動物という「全体集合」を指す言葉。

 

サブクラス

全体集合を指すスーパークラスから想定的にみて、哺乳類や爬虫類などの部分集合を指す言葉。

 

サブルーチン

関数のこと。関数を呼び出す主のメインルーチンと対比してサブルーチンと呼ばれる。

 

ローカル変数

使える範囲が決まっている変数。関数内で定義した関数内でしか使えない。関数呼び出し時に作られて、抜ける時には破棄される。

 

グローバル変数

ローカル変数とは異なり、どこからでも参照や書き換えが可能な変数。基本的には使わない方向でコードを書いていきたい。なぜなら、どこでも使えて便利な一方、知らないうちに書き換えて他の関数に影響を与えてしまったりするから。変更したら、サブルーチンに影響を与えてしまっている可能性が出てくるので、確認しなくてはならなくなる。数が多いと大変なことになる。アプリの初めから最後まで全てで存在可能。

 

インスタンス変数

インスタンスから呼び出される、クラス内で定義される変数。ローカル変数とグローバル変数の良い部分を取り入れて考えられた変数。グローバル変数のように他の変数に影響を与えないためにアクセス範囲を指定できる。グローバル変数は、アプリに1個だけ存在するある変数だが、インスタンスは作れば作るほど、その変数領域を広げることができる。

 

値渡し

関数に変数を引数として渡す時にコピーしたものを渡すこと。コピーした変数を渡すので、呼び出し元の関数内の呼び出された関数内で変数の値が変更されても、呼び出し元には影響は与えない。使うことで関数の独立性を高めることができる。

 

参照渡し

関数に変数を引数として渡す時に、コピーしないで渡すこと。コピーしない変数を渡すので、呼び出し元の関数内の呼び出された関数内で変数の値が変更されると、呼び出し元の変数に影響を与えてしまう。使用はできるかぎり避けた方がいい。

 

ビット演算

2進数の0か1のビット単位で計算する方法のこと。

 

入れ子構造

関数の中に関数があるような入れ子の構造になっている状態。

 

ポインタ

アドレス変数とも呼ばれる。変数のアドレスを記憶する変数。

 

コンパイラ

機械語に翻訳する作業

 

GOTOレスプログラミング

(厄介だと言われる)GOTO文(プログラム内の指定された場所に無条件でジャンプする命令)を少なくするというプログラミングの考え方。スパゲッティコードを生み出す原因。

 

基本三構造

構造化プログラミングで提唱されたコードをわかりやすくしようという基本的な3つの構造のこと。

  • 順次進行
  • 条件分岐
  • 繰り返し

 

プロパティ型指定

qiita.com

このページでPHPに関して情報が載っている。

 

パッケージ

クラスをまとめる仕組み。ディレクトリのように管理できて、クラスの名前の重複を避けることができる。「Composer」というパッケージ管理ツールなどを使用したりする。

 

 責務(Responsibility)

ソフトウェアとしてのクラスの役割を決めること。どんな役割分担を担うのかという責務。

 

重複の排除

プログラムを書く際に、重複の見落としによる修正もれが起きやすくなる。

 

凝集度

個々の部品のまとまり具合を評価する尺度。これが高ければ高いほど優れたプログラム。 独立性。クラスで秘密を作れば作るほど独立性は高まる。分かりすい名前をつける。機能を盛り込み過ぎない。

 

結合度

部品間の結びつきの度合いを評価する尺度。これが低ければ低いほど優れたプログラム。 

 

クラスの依存の循環

クラスの依存の循環は避ける。クラスのどれかに手をつけた場合、全て確認しなければならなくなるため。

 

ウォーターフォール型

計画、設計、プログラム、テスト、と順番に行い、「滝」という意味通りに前の工程には戻らないことをいう。作業手順を定めることで計画通りに進めることが主眼に置かれていた。早い段階で要求を確定することで、仕様変更を最小限に収める。

 

アジャイル開発

ウォーターフォール型とは対照的に、小さくリリースして段階的に作り上げていく方法。 反復をすることでリスクを最小限に留め、顧客やチームの協力を重視して変化への柔軟性が主眼に置かれている。リリース、顧客からのフィードバックというのを繰り返す。

 

SOA(Service Oriented Architecture)

サービス指向アーキテクチャ。システムを部品の集まりとしてみなす手法。

 

 

イテレーション

要求定義、設計、プログラミング、テストまでの一連の作業を反復すること。

 

リファクタリング

プログラムの動作を変えることなく、ソースコードを整理すること。

 

XP

エクストリームプログラミング。「コミュニケーション」「単純さ」「フィードバック」「勇気」を大切な4項目に掲げるプログラミング手法。勇気とは設計変更をする勇気のこと。どのような環境に置かれれば、最高のパフォーマンスができるかを考えられたことによって生まれた。XPの登場によりアジャイル開発が進んでいった。

 

CI(Continuous Integration)

継続的インテグレーション。インテグレーションは統合を意味する。コードを出荷できる状態を保ちながら品質を維持すること。メンバーのモジュールを定期的に結合テストしないと不整合が発見できない。継続的に結合することで、早期発見できる。

 

TDD(Test Driven Development)

テスト駆動開発。詳細設計、プログラミング、単体テストを一つのまとまった作業として捉える手法。確実に動くプログラムを作れて、フィードバックが早いのが特徴。

 

ビルド

ソースのコンパイルやライブラリのリンクを行い、実行可能なファイルを作成すること。

 

モジュール

他のものと組み合わせて使うことが想定された部品。

 

ロギング

機械に履歴を記録すること。 

 

実装

https://i.gyazo.com/19dfe6aa63126f19d2d8e871acf7dfb1.png

とりあえず実際にコードを書いてみた。

 

以下が実行結果

https://i.gyazo.com/2228ed2751acdc22d036f71cae9e2baa.png

まず、クラスを定義する。クラス名の初めは大文字にする。今回は「Human」としてみた。人種をイメージしてほしい。

 

波カッコの後にプロパティを定義する。プロパティはクラスの特徴を表すものなので、どんな人種がいるか知りたいところだ。今回のプロパティは「$country」と「$language」にした。国籍と言語がわかる。

 

この「Human」というクラスが「できること」として、名前と年齢を表示するという機能をつけてみた。それが「selectData」というメソッドだ。この金型をコピーすればもれなく付いてくる機能で、メンバーを管理するのに便利そうだ。

 

7行目では、「$this」というのが出てきたが、これは擬似変数と呼ばれるもの。何かと言うと、クラスを定義しているこの時点では「まだ新規登録されるオブジェクト(ここでは$number_1のこと)」が分からないから、とりあえずこの擬似変数を書いておくということ。「selectData」というメソッド(関数)を呼び出した時に、どのオブジェクトからアロー演算子で引っ張ってきたかがわかるので、このケースであれば「$this」は「$number_1」となっている。

 

クラスを定義しただけでは(ただの金型なので)何の役にも立たない。波カッコで閉じてクラスの定義を終えた後に、今度はインスタンス化してオブジェクトを作っていく。まずは、金型であるクラスで作る実体の名前を指定する。10行目では、「Human」クラスの「new」メンバーとして「$number_1」を作成した。世界の人種の「ゼッケン番号1番が日本」というイメージ。インスタンスを生成する場合は「new」を使う。

 

11行目を説明する。「$number_1->country」というものが意味することだ。これは、『「$number_1」という新しいメンバーの「country」という情報にアクセスするという行為』に「"japan"」を代入している、ということだ。「->」はアロー演算子と呼ばれ、左辺から右辺を取り出す演算子。「$number->country」で一括りと見るとわかりやすい。続く12行目の「language」も同じ処理だ。

 

14行目の処理を説明する。「Human」クラスの金型で生成した「number_1」という新しいオブジェクトが「 Human」から得た能力であるメソッド(関数)を持っているが、それに「->」でアクセスして関数を実行していることを示している。

 

コンストラクタを作る

construct」という命令をクラス内で書いておくことで、作業を簡略化することができる。特別なメソッド(関数)でマジックメソッドとも呼ばれる。「construct」とは日本語で「構成する」などを意味するが「事前に金型を複雑に組み立てて置いてコピー時に能力を増やす」というようにイメージすると覚えやすいかもしれない。インスタンスを生成してオブジェクトを作った時にだけ「発動」するという特徴を持っている。一回だけ呼ばれるメソッド。インスタンスの初期化処理を記述する。初期値の設定に使われる。今回の国と言語の初期値設定は国籍などが変わらない限り初期値として設定しても良さそうなので、試しにコードを書いてみた。変更しなそうな名前と言語はコントラクタで初期値として指定できるように組み込む。

https://i.gyazo.com/bc078011b4eeffebe90a5d5c3451a7be.png

6行目にコントラクタの命令が加わっているのがわかる。「__contruct」のようにアンダーバーを二つ繋げて書く。特別なマジックメソッドだが、これも関数なので「function」で作る。今回は国と言語の2つを初期値として一度だけの処理をしたいので、「$country, $language」と書いた。カッコ内にコンまで続けて書く。そのあと、波カッコで、「インスタンス生成時には$countryと$languageを初期値として登録する」という命令を書く。つまり、「後から入力されるのが想定」されているプロパティ($countryと$language)を、「$this」つまり「後から入力されるのが想定されているインスタンス生成されたオブジェクト(今回の場合は$number_1)」がアロー演算子でアクセスした「country」と「language」に代入するということだ。

 

14行目は、15行目・16行目を書き直したもの。クラス名の後にカッコの中にコントラクタで定義した「$country」と「language」に代入したい文字列を入力してあげる。

 

アクセス権

プロパティとメソッドへアクセスできる場所を制限することもできる。これまで使ってきた「public」というのもアクセスを意味していた。3種類ある。

  • Private:クラス内のみからアクセスが可能
  • Protected:クラス内と親子クラス内からアクセスが可能
  • Public:どこからでもアクセスが可能

「Public」はインスタンスから直接アクセスできるが、「Private」と「Protected」はインスタンスから直接アクセスはできない。「Private」の場合、クラス内で定義したメソッドから同クラス内のプロパティにアクセスして使うようなイメージ。

 

https://i.gyazo.com/cd6f730fafe50ff775fd9ac005f1f162.png

プロパティ「$country」を普通に「public」に設定して、15行目で設定したメソッド(関数)を呼び出し、16行目で「echo」で「$counrty」にアクセスした結果を出力してみる。

 

https://i.gyazo.com/ef98141cf62bbc3cbfd22850cab5bd65.png結果は上図のようにきちんと出力された。

 

https://i.gyazo.com/753bc65dd018a2c0a12a34e4948222ce.png

今度は「$country」を「private」にしてアクセスを制限してみる。

 

https://i.gyazo.com/9519672550cb50c5a53d86caca11f151.png

 「$counrty」に直接アクセスしようとした16行目だけ表示されていないのがわかる。15行目はクラス内の関数で「$country」にアクセスしているので表示に成功している。インスタンスはメソッド「selectData」にアクセスしただけだからである。

 

https://i.gyazo.com/04f71db256dc2ec81deb9d3c45bc9e20.png

ターミナルにはこのようなエラーもでた。「cannnot access private property Human 」と書かれて、アクセスが制限されてきちんとエラーになっているのがわかる。 

 

staticキーワード(メソッドに使用)

実はインスタンスを生成しなくてもクラスを使うようにできる方法がある。クラスを「staticキーワード」で定義することで可能となる。

https://i.gyazo.com/99691f4679aa3b0d1172329d74360a57.png

13行目に「static」でメソッドを定義した。

 

https://i.gyazo.com/09bf410d355c33556f0f478dfa3f4e81.png

このようにインスタンスを生成しないでメソッドを使うことに成功した。

直接クラスのメソッドを使用するので、引数は取らないのでカッコ内は空欄にしておく。「directMessage( )」。また、メソッドを呼び出すときはクラス名の後に「::」とセミコロンを2つくっつける。

 

staticキーワード(プロパティに使用)

今度は「static」キーワードをプロパティに適用していく。

https://i.gyazo.com/3815267914d7688568b6ef331121c1b9.png

6行目に「$count」というプロパティを追加した。これはクラスをコピーしてインスタンスを生成するたびに、その数のカウントを表示することを想定したプロパティだ。 

 

7行目で作ったコントラクタ(インスタンス生成時に、初回だけたった一回動くメソッド)に「self::」というのが追加されているのがわかる。この「self::」は「$this->」と同じような働きをすると覚えればいい。その違いだが、「$this」は「static」ではない動的なものへアクセスするとき、「self」は「static」である静的なものへアクセスする時に使われる。さらに詳しくいうと、「$this ->」は、「$this」へ将来代入されるインスタンスがプロパティにアクセスすることを示しているのに対し、「self::」は文字通り「自分自身」のクラスへアクセスすることを示している。なぜ「self」になるのかといえば、「static」でインスタンスを生成する必要がないので、自分が自分でアクセスする、といったイメージだ。

 

10行目で「++」という加算子でインスタンスが生成されるたびに数字を1つずつ追加していくという命令をコントラクトメソッドに追加している。

 

23行目では「staticメソッド」の時と同様に。クラス名の後にセミコロンを二つくっつけて「staticプロパティ」にアクセスしている。

 

表示結果はこうなる。

https://i.gyazo.com/f8009d2f7cc4fb7f2e3aaf56dae6d30d.png

 

クラスの継承

クラスを継承して「子クラス」を作ること。クラスの共通部分を「子クラス」としてまとめる仕組み。コードの重複を排除できる。

class Human

をコピーして子クラスを作りたいときは、

class SpaceAlien extends Human

とする。

https://i.gyazo.com/e014dbaa43dab351854e8a6745f306db.png

19行目に「Bird」という子クラスを作った。「Bird」は動物だが、「Human」と人間を定義している「金型」のコピーを生成して同じ機能をもたせたいのでBird

にした。「number_1」とゼッケン番号1番が「japanese」なら、子クラスの「number_1」は「swan」と白鳥とかをイメージするといいかもしれない。子クラスははじめ「宇宙人」とか「白人」とか「動物」とかにしたのだが、クラスを継承して同じ機能を使うことを目的としているのなら、「鳥類」が「人類」を表す「Human」を継承するには同列で記憶しやすいかと思い「Bird」にした。

 

https://i.gyazo.com/779deb849b3c60e8251f9b30a31016d6.png

これが実行結果。

21行目から25行目までの命令もしっかり使えるようになっているのがわかる。

 

親クラスのメソッドの上書きと子クラスでのメソッド追加

子クラスが継承した親クラスのメソッドはそのまま使えるし、上書きして使うこともできる。これを「Override」という。

https://i.gyazo.com/1e3e0fbe544a211e5b0022d032f7b27d.png

親クラスの「Human」を継承して子クラスの「Bird」を作ったものに機能を色々と追加した。18行目までは前回と同じコードとなっている。18行目までは「Human」クラスに関する定義だ。その18行目までの定義をまるまる継承したのが「Bird」で、19行目からそのコードが書かれいている。

 

まず20行目の「selectData」という親クラスから継承したメソッドを見てみたい。メソッド名をそのまま使えるし、さらに上書きをすることもできるので、鳥らしく文章を変えてみている。

 

23行目では、子クラスである「Bird」クラスのみが使える新しいメソッドを定義した。鳥類は「hello」とは言わないので「quack」と鳴くようにしてメソッド名も「fromBird」を付け加えた。このようにクラスは継承されるだけでなく、子クラスで新しい機能(メソッド)を追加することができるのだ。

 

28行目では、子クラスのインスタンス(オブジェクト)を作った。「Human」クラスの人類のゼッケン番号は「$number_1」にしたので、鳥類は「$no_1」としている。鳥類の登録一番目は白鳥(swan)ということ。「country」はちょっと無理があったが鳥類の名前として「swan」を代入して、「language」にはこれも強引だが「quack」と鳴き声を入れた。

 

30行目を見ると「$no_1」のインスタンスが親クラスのメソッドである「selectData」にアクセスしているのがわかるし、32行目では「static」で定義した静的なメソッドに「Bird」がアクセスしているのがわかる。

実行結果は以下のようになった。

https://i.gyazo.com/7a46fdbeed55b2dbc3d23d9a4f562884.png

 

33行目では、きちんと「Bird」クラスが親クラスで定義した「 $count」を継承して使えているのがわかる。

  

抽象クラス(abstract)

それ自体はインスタンスを生成できないが、子クラスに継承させることだけを想定して作成するクラスのこと。子クラスで実装漏れを防いだり、子クラスの実装をシンプルにできるという利点がある。金型を作るための金型みたいなもの。

 

https://i.gyazo.com/ac7ccc61c8709c671256e3358c1ad0ca.png

3行目を見るとわかるが、抽象クラスを作る際には普段クラスを生成する時の「classクラス名」ではなく「abstract classクラス名」とする。「abstract」は吸収するという意味なので覚えやすい。

 

6行目の、継承クラス内の「abstract」で定義されたメソッドは、子クラス内で必ず実装しなければならないというルールがある。その際は、メソッドのあとを空欄にしておくというのもルールにある。子クラスで継承して、子クラスでそれぞれ定義してくださいということだ。このように後からメソッドを定義すれば、「Bird」を作る際の強引さも多少は軽減されそうである。

 

13行目で「BaceCategory」を継承している。

 

https://i.gyazo.com/d8bdd955e1bfd26ab50671221d74e6dd.png

実行結果はこのようになる。

 

havelog.ayumusato.com

このページの「abstruct」とはがかなりわかりやくす説明しているので、このページを貼り付けておく。

 

インターフェース

やはり上でリンクを貼ったページの「interface」の箇所を見るとわかりやすい。抽象化(abstract)と似ているが、異なる性質をもつ。「abstract」がプロパティという性質とメソッドという共通した機能を持った、量産のための金型の金型を作る命令なのに対して、「interface」は共通のメソッド(機能)を持たせる複数のクラスを作ることを想定している。

 

インターフェースは、先に定義したメソッドを、そのあとに定義するクラスで使用しなればならないというルールを設けることができる。

 

インターフェースでは、アクセス権は「public」のみ。

 

https://i.gyazo.com/48686d0be512cc2bdd8be2b5b70e30f5.png

 3行目で、まず「interface」と書いているが、これでメソッドが定義できる。今回は共通の「機能」を子クラスに継承させるという意味を含めて「Action」とした。共通の行動を持った異なるクラスをイメージした。機能は「move」と「make_sound」だ。つまり動けるもので、音をさせるものの機能を持ったクラスが想定されている。

 

8行目から、クラスを定義して「implements」という命令で「interface」で定義したメソッドを継承する。継承するといっても中身のない金型なので、子クラスの中で定義していく。子クラスで必ず「interface」のメソッドを実装しなければならないというルールがある。

 

子クラスは「Human」と「Car」とした。「abstract」でHumanを作るもので「Car」は作りたくはないが、「interface」ならば多少はしっくりとくる。

子クラス内で、具体的な行動を定義した。

 

https://i.gyazo.com/51d40d0f4c5182c62a7e0b8c3b044eee.png

実行結果はこのようになる。

子クラスは複数のインターフェースを継承できる。

class Human implements Go, Back

といった感じでコンまで繋ぐことができる。

また、インターフェースは追加で実装はできない。 

 

インターフェースと抽象化を同時に

上記の二つを一緒に継承できる。

gyazo.com

 

実行結果は以下のようになる。

https://i.gyazo.com/efc6924c933e668ef24c5b0daddd8a30.png

 

外部ファイルの読み込み

「require」はエラーが出た場合に「fatal error」を発生させてくれて、処理されずに終了する。

 

「include」はエラーが出たら「warning」を発生させてくれるが、処理はそのまま実行される。

 

「require_once」と「include_once」という命令もあるが、これは両方とも、すでにファイルが読み込まれているかチェックしてくれて読み込まれていればその処理をスキップしてくれるというもの。

 

「autoload」という方法もある。クラスにしか使えない。

 

gyazo.com

「Test.autoload.php」というファイルを作り、そこに上記のように記述した。

 

https://i.gyazo.com/2ac22bd157f720f8046b8ca745627394.png 「Test.autoload.php」と同じ階層のディレクトリの「index.php」に上記のようにコードを書いた。「spl_autoload_register」を使用してオートローダーを登録しておくことで自動で読み込んでくれる。

 

実行結果は「his face is white」となる。

 

Composer

「composer」はライブラリを管理できるツール。Composerを使用してライブラリをインストールすることで、 「vendor/autoload.php 」というファイルが生成される。そして、このファイルを require すると、 vendor 配下のライブラリをオートロードできるように設定してくれるという便利なもの。

reffect.co.jp

 

このページに詳しい手順が載っている。

 

例外処理

「try」と「catch」で例外処理をする。「if」を使い条件分岐をして、「throw」を使ってPHPで初めから定義されているインスタンスの「Exception」という例外を投げる。

https://i.gyazo.com/8c253ee70c0c5b781d5a4cd9f38d3e39.png

例えばこのようにコードを書く。 実行結果は「エラーです」となる。

 

 

参考文献

『オブジェクト指向でなぜつくるのか』平澤 章 著

 

 

 

www.mapp.jp

 

 

www.mapp.jp

 

 

www.mapp.jp