PHP初心者から中級者へ!PHPのオブジェクト指向入門
初心者でも学びやすくプログラミングシェアも高いため、サーバーサイドの開発をPHP言語学習から始める方も多いのではないでしょうか。
確かに、使いやすく便利なプログラム言語ですが、PHPは「オブジェクト指向」と呼ばれる大規模開発にも対応できる活用範囲の広い言語です。
PHPの初心者からステップアップするためにも、ぜひPHPのクラスの概念や利用方法についても身に付けていきましょう。
オブジェクト指向とクラスの概念
現実の世界をコンピュータの世界で表すために用いられるのが「オブジェクト指向」と呼ばれる概念です。
現実世界にある1つの事物・事象をオブジェクトとして捉え、オブジェクトに動作(メソッド)と属性(プロパティ)を持たせることができます。
そして、そのオブジェクトを作る元となる「型」が「クラス」です。
これから、PHPでのクラスの作り方に触れながら、オブジェクト指向でのプログラミング方法についてお話をしていきたいと思います。
クラス
PHPでクラスの作るためには、アクセス権・継承といったクラスの概念に附帯するさまざまな項目を理解していく必要がありますが、1つの店舗をクラスで表すと下記例のようになります。
class FoodShop { private $earnings = 0; //売上金額 private $clerk = 3; //店員数 private $items_count = 3000 //商品数 public function sell() { $this->earnings += 1000; //売上を1000加算 $this->items_count -= 1 //商品数を1減算 } }
クラスには動作(メソッド)と属性(プロパティ)を持つことができますが、
private $earnings = 0; //売上金額 private $clerk = 3; //店員数 private $itemsCount = 3000 //商品数
の3つはプロパティになります。
現実の店舗を考えると実際にはもっとたくさんのプロパティがありますが、売上金額・店員数・商品数をプロパティにするとこのようになります。
変数宣言部の前に付いている「private」は、アクセスできる範囲を示す「アクセス権」を示しています。
「private」は同じクラス内からのみアクセスができるという意味になります。
オブジェクトをインスタンスと呼ぶことがありますが、外部のクラスのオブジェクト(インスタンス)から自クラスのプロパティを変更されることを防ぎたい場合は「private」を指定します。
このように、自分のクラスやメソッドを外部のクラスから操作されることを防ぐことを「カプセル化」と呼ぶこともあります。
そして、動作(メソッド)は、下記のようになります。
public function sell() { $this->earnings += 1000; //売上を1000加算 $this->itemsCount -= 1 //商品数を1減算 }
今回は、「商品を売る(sell)」というメソッドを1つ作っていますが、本来はもっとたくさんのメソッドがあるはずです。
メソッドの中を見てみると、売上を1000増やして、商品数を1つ減らす処理を行っています。
商品の種類に応じて商品価格は異なるはずなので、実際は商品名と商品価格を管理することも必要になってきます。
このメソッドは「public」というアクセス権となっていますので、クラス内外からアクセスができます。
通常は、プロパティはprivateとしメソッドはpublicとして、外部からプロパティを操作されることを防ぎ、メソッドからプロパティにアクセスをしていきます。
プロパティに値を設定するときの「$this->」の部分は自クラス内のメソッドやプロパティにアクセスする際に記述します。
継承
クラスには親子関係を持つことができ、親クラスのメンバを子クラスに継承することができるようになります。
次の例は親クラスを「Shopクラス」、子クラスを「FoodShopクラス」としています。
class Shop { private $name; //店舗名 private $size; //店舗面積 public function setData($shopName, $shopSize){ $this->name = $shopName; $this->size = $shopSize; } public function getName(){ return $this->name; } public function getSize(){ return $this->size; } } class FoodShop extends Shop{ private $earnings = 0; //売上金額 private $clerk = 3; //店員数 private $itemsCount = 3000; //商品数 public function sell() { $this->earnings += 1000; //売上を1000加算 $this->items_count -= 1; //商品数を1減算 } } $foodShop = new FoodShop(); $foodShop->setData("hoge", 30); echo $foodShop->getName(); //出力結果は「hoge」
「extends」の左側に子クラス、右側に親クラスを書くことで継承関係を示すことができます。
親クラスに定義されている店舗名を取得する「getNameメソッド」を子クラスのインスタンスから実行できているのがわかりますね。
このようにクラスは親子関係を持つことができるようになっていますので、それぞれのクラスに共通のメソッドやプロパティを親クラスにまとめることができます。