【プロゲート】PHP PHP IIIの学習内容まとめ
PHP III
1.目標物を確認しよう
オブジェクト指向を学ぼう
・PHPⅡに引き続きオブジェクト指向を学んでいく
・PHPⅡで作成した料理注文サービスを、新しい知識を学びながら発展させていく
2.クラスプロパティ
クラスプロパティ
・ここではまずメニューの数を表示していく
・メニューの数は生成されたインスタンスの数と一致する
・インスタンスの数は個々のインスタンスではなく、クラス全体で管理する必要がある
・「クラスプロパティ」というものを用いるとこれを実現できる
クラスプロパティの使い方
・個々のインスタンスがもつデータ(プロパティ)ではなく、クラスがもつデータをクラスプロパティと言う
・クラスプロパティは「static」を用いて定義する
・クラスプロパティにアクセスする場合は「クラス名::$クラスプロパティ名」のように「::」(コロン「:」2つ)を用いる($の位置に注意)
3.クラスメソッド
クラスメソッド
・生成されたインスタンス数(メニュー数)が変化した時に自動的に$countの値が変わるようにする
・$countの初期値を0として、コンストラクタ内でクラスプロパティ$countの値に1を足すことで、生成されたインスタンスの数(メニュー数)を数えることができる
self
・クラス内でクラスプロパティにアクセスする際は「self」という特殊な変数を用いる
・selfは、クラスの中で使うとそのクラス自身のことを指し示し、「self::$クラスプロパティ名」のように使う($の位置に注意)
・このselfを用いてコンストラクタの中でクラスプロパティ$countの値を変更する
クラスメソッド
・$countのアクセス権をprivateするとクラスの外から$countにアクセスできなくなるので$countのゲッターを定義する
・$countのゲッターのように、個々のインスタンスのデータに関係ない処理を行いたい時には「クラスメソッド」を用いる
・クラスメソッドは「static」を用いて定義し、「クラス名::クラスメソッド名」のように呼び出す
4.継承
食べ物と飲み物を分けよう
・ここからはメニュー一覧の食べ物には辛さを、飲み物にはホットかアイスか(タイプ)を表示していく
・Menuインスタンス全てに辛さとタイプの両方のデータを持たせるのではなく、食べ物には辛さのデータを、飲み物にはタイプのデータをそれぞれ持たせたいので、食べ物と飲み物は別のクラス(Food、Drink)として、それぞれのクラスからインスタンスを生成するようにする
クラスの内容を引き継ごう
・新しくFoodメニュー(Foodクラス)とDrinkメニュー(Drinkクラス)を作っていく
・FoodクラスとDrinkクラスのデータや機能のほとんどは、今までに実装したMenuクラスと同じなので、Menuクラスの内容を引き継いだ上で、カスタマイズしていく
継承とは
・すでに定義されているクラスのプロパティやメソッドを別のクラスに引き継ぐことを「継承」と言う
・このとき引き継がれる元のクラスを「親クラス」、継承してできる新しいクラスを「子クラス」と呼ぶ
・子クラスは、親クラスのプロパティやメソッドを全て引き継いだ上で、独自の機能を追加することができる
継承の書き方
・継承を用いて新しく子クラスを定義するときは、「extends」を用いて「class 子クラス名 extends 親クラス名」のように書く
継承の使い方
・子クラスは親クラスのプロパティやメソッドを引き継いでいるので、親クラスで定義されているメソッドを呼び出すことができる
5.独自メソッド、プロパティ
独自プロパティ
・まずはDrinkクラスをカスタマイズしていく
・Drinkオブジェクトに、ホットかアイスかのタイプを持たせたいので、それを管理するための$typeプロパティを追加する
・このように子クラスには独自のプロパティを追加することができる
独自メソッド
・子クラスには独自のメソッドも定義することができる
・$typeプロパティのゲッターとセッターをDrinkクラスに定義する
メソッドの呼び出し
・子クラスのメソッドを呼ぶ際には図のようにメソッドが検索される
・子クラスにメソッドが定義されている場合にはそのメソッドが、定義されていない場合には親クラスのメソッドが呼び出される
6.instanceof
クラスによって処理をわけよう
・FoodクラスのインスタンスからそのgetType()メソッドを呼ぶとエラーが出てしまうので先程の演習ではFoodのデータを削除していたが、
今回はFoodのデータも表示するようにして、インスタンスがDrinkクラスのものである時だけgetTypeメソッドを呼ぶようにする
instanceof
・「instanceof」を用いると、あるインスタンスが特定のクラスのインスタンスであるかどうか判別することができる
・「インスタンス instanceof クラス名」のようにすると、インスタンスが指定したクラスのインスタンスである場合は「true」に、そうでない場合は「false」になる
7.protected
オーバーライド
・先ほどまではセッターを用いて$typeの値をセットしていたが、ここではDrinkクラスに独自のコンストラクタを定義して、$typeの値をセットする
・__constructメソッドは親クラスですでに定義されているが、同じ名前のメソッドを子クラスで定義するとメソッドの中身を上書きすることができる
・このようなメソッドの上書きを「オーバーライド」と言う
子クラスとアクセス権
・プロパティのアクセス権がprivateだとクラス外からそのプロパティに直接アクセス出来ないことはPHPⅡで学習したが、実はprivateなプロパティには子クラスからもアクセスすることができない
・Drinkクラスの中からMenuクラスのprivateなプロパティにアクセスすることはできない
protected
・子クラスから親クラスで定義したプロパティにアクセスしたい場合は、そのプロパティのアクセス権を「protected」にする
・アクセス権がprotectedのプロパティには、そのクラス内からと、そのクラスを継承している子クラス内からのみアクセスすることができる
アクセス権まとめ
・ここで「public」「protected」「private」の3つのアクセス権についておさらい
・public: どこからでもアクセス可能
・protected: そのクラスと子クラス内からのみアクセス可能
・private: そのクラス内からのみアクセス可能
8.parent
コードをまとめよう
・MenuクラスのコンストラクタとDrinkクラスのコンストラクタは多くの部分が重複している
・このままでは重複部分を変更するときに2箇所とも変更する必要があり、管理するのが大変
・重複するコードを1箇所にまとめることによってこれを解決する
parent
・オーバーライドの際に親クラスで定義したメソッドを呼び出したいときには、「parent」を用いて「parent::メソッド名」のようにする
・「parent::メソッド名」を記述した場所で、親クラスのメソッドが実行される
・これを用いると先ほどのコンストラクタがすっきり書ける
9.継承について復習しよう
Foodクラスをカスタマイズしよう
・ここではFoodクラスをカスタマイズしながら、継承に関する知識をおさらいする
・Foodオブジェクトには、辛さ(0~3)を持たせたいので、それを管理するために$spicinessプロパティを追加する
・まずは辛さを表示していく
endifとelse
・spicinessプロパティの値を表示する際に、そのインスタンスがFoodクラスのインスタンスである(Drinkクラスのインスタンスでない)か確認する必要がある
・if():~endifのように書けることはPHPⅡで学習したが、elseを用いる場合はif():~else:~endifのように書く
10.Foodの表示を仕上げよう
Foodの表示を仕上げよう
・いよいよ最後の演習
・辛さの数だけ唐辛子を表示していく
・繰り返し処理を辛さの数(spicinessプロパティの値)だけ回して唐辛子を表示する
この記事が気に入ったらサポートをしてみませんか?