【作って納得!PHP入門】クラスを使ってみよう

PHP

前回は関数について記載しました。

今回はクラスについて見ていきます。

最初にクラスについての説明をします。
その後に、実際に簡単なプログラムを作成して、クラスについて学んでいきます。

この記事の目標(作るもの)について

クラスを使用した簡単なプログラムを作成し、下記のように画面に結果を出力して確認します。

PHPのクラスとは?

クラスについての基本的な説明は、こちらをご覧ください。
PHPのクラスもこちらとほぼ同等と、考えて良いです。

クラスの基礎、カプセル化、継承と3つに分けています。

PHPのクラスは他の言語と同じようにオブジェクト指向プログラミング (OOP)でプログラムを作成していくときに使用する機能です。
PHPで定義されている標準クラスもありますが、自分で定義して自作のクラスを作ることもできます。

上記のリンク先に書いてあるように、オブジェクト指向についてはこのようなイメージです。

オブジェクト指向はモノを使うイメージです。モノには名前などのプロパティと振る舞い(メソッド)が存在します。

クラスはモノを作る前の設計書で、この設計図をインスタンス化(new)することで、オブジェクトが作られます。

オブジェクト指向に関して、難しく捉えがちですが、まずは実際に使ってみましょう。
なんとなく理解できてコードを読むことができるようになると、少しずつ書けるようになっていくかと思います。
少しずつ理解を深めていきましょう。

クラスの基本的な書き方

PHPでクラスを書くときはこのように定義します。

<?php
class [クラス名] {
  // ...フィールドやメソッドを書く...
}

[クラス名]の箇所にクラスの名前を書きます。
クラス名には好きな名前をつけることができますが、公式を確認すると下記のようなルールがあります。

クラス名には、PHP の予約語以外でラベルとして有効なあらゆる名前を使用することができます。 有効なクラス名は、先頭が文字あるいはアンダースコアで始まり、 その後に任意の数の文字/数字/アンダースコアが続くものです。

予約語はPHPで特別な意味を持つキーワードです。
予約語については公式ドキュメントのこの辺を確認してみてください。

クラスを使用した実例

実際にコードで書いて見ると、こんな感じになります。

<?php
class Food {
    private $name;
    private $weight;
    private $taste;
    private $color;

    public function __construct($name, $weight, $taste, $color) {
        $this->name = $name;
        $this->weight = $weight;
        $this->taste = $taste;
        $this->color = $color;
    }

    public function showFood() {
        echo "食べ物の名前は{$this->name}です。<br />重さは{$this->weight}グラムです。<br />味は{$this->taste}です。<br />色は{$this->color}です。<br />";
    }
}

食べ物のクラスを作成してみました。

名前・重さ・味・色といったフィールドを用意しました。
アクセス修飾子はprivateを設定しています。

アクセス修飾子についてはクラスのカプセル化の記事に書きました。
privateに設定しているので、クラスの内部からしかアクセスできないフィールドになります。

PHPのアクセス修飾子も同じように下記の内容になります。

アクセス修飾子内容
publicすべてのクラスからアクセス可能
private現在のクラスのみアクセス可能
protected現在のクラスとサブクラス(継承先)からアクセス可能

メソッドは、showFoodというフィールドに設定された情報を出力するメソッドを用意しました。

// ---- 省略 ----
public function showFood() {
    echo "食べ物の名前は{$this->name}です。<br />重さは{$this->weight}グラムです。<br />味は{$this->taste}です。<br />色は{$this->color}です。<br />";
}

__constructはクラスのコンストラクタです。
コンストラクタは、前述したリンク先でも紹介しましたが、newしたときに処理をしてくれるメソッドをコンストラクタといいます。
基本的にはフィールドに値を設定するために使用されます。

これを実際に使うときには、下記のようにnewしてオブジェクト化します。
そうすると、publicに設定されているフィールドやメソッドを呼んだり、値を設定することが可能になります。

$food = new Food("お寿し", "50", "美味しい", "色々");
$food->showFood(); // publicなメソッドが呼べる

クラスのことが、なんとなくわかりましたでしょうか。
それでは実際にクラスを使用したコードを書いて、確認していきましょう。

PHPでクラス(class)を使ってみよう

実際にクラス使用して、処理を書いてみましょう。
前回作成したcodelike_web_dockerの配下に、food_class.phpという名前で下記の内容で保存します。

<?php
class Food {
    private $name;
    private $weight;
    private $taste;
    private $color;

    public function __construct($name, $weight, $taste, $color) {
        $this->name = $name;
        $this->weight = $weight;
        $this->taste = $taste;
        $this->color = $color;
    }

    public function showFood() {
        echo "食べ物の名前は{$this->name}です。<br />重さは{$this->weight}グラムです。<br />味は{$this->taste}です。<br />色は{$this->color}です。<br />";
    }
}

echo "test class1 <br />";
$sushi = new Food("お寿し", "50", "美味しい", "色々");
$sushi->showFood();

echo "<br />test class2 <br />";
$ramen = new Food("ラーメン", "300", "濃厚な豚骨味", "ちゃいろ");
$ramen->showFood();

echo "<br />test class3 <br />";
$chocolate = new Food("チョコレート", "50", "あまーい", "ブラウン");
$chocolate->showFood();

解説

今回は食べ物クラスを作成してみました。このクラスについて解説していきます。

作成したフィールドについて

フィールドは名前・重さ・味・色の4つで、アクセス演算子はprivateを設定しています。

privateを設定しているので、アクセス不可のフィールドにアクセス使用とすると

$sushi = new Food("お寿し", "50", "美味しい", "色々");
$sushi->name = "ちらし寿司";

下記のようなエラーが発生します。

Fatal error: Uncaught Error: Cannot access private property

カプセル化の考え方で、基本的には値を格納するメソッドや取得するメソッドを作って使用すると良いかと思います。

コンストラクタについて

PHPのコンストラクタは、__constructという名前のメソッドを作ることで作成できました。
__constructのメソッドはPHPで決まっているので、この用途以外では使用することができません。

__constructで作成したメソッドは、クラスがnewされるときに呼ばれます。
ここでやっていることは、newされたときに渡した値をオブジェクトに格納しています。
このようにnewしてインスタンス化すると、それぞれの値が格納されます。

$sushi = new Food("お寿し", "50", "美味しい", "色々");

$nameに”お寿司”, $weightに”50″, $tasteに”美味しい”, $colorに”色々”が設定されます。

showFoodメソッドについて

このメソッドはオブジェクトに設定された値を、文字列にして出力してくれます。
出力する内容は下記のようになっています。

食べ物の名前は{$this->name}です。<br />重さは{$this->weight}グラムです。<br />味は{$this->taste}です。<br />色は<$this->color>です。<br />

PHPで$thisは自分のオブジェクトを指しています。
$this->nameで格納された名前、$this->weightで格納された重さ、$this->tasteで格納された味、$this->colorで格納された色が参照できます。
それぞれに格納された内容を文字列に展開して、内容を出力しています。

なので、このようにnewを使ってインスタンス化した場合には

$sushi = new Food("お寿し", "50", "美味しい", "色々");
$sushi->showFood();

出力される結果は「食べ物の名前はお寿しです。<br />重さは50グラムです。<br />味は美味しいです。<br />色は色々です。<br />」を想定しています。

プログラムの中ではtest class1〜class3までで、3回別の値を入れてインスタンス化しています。

echo "test class1 <br />";
$sushi = new Food("お寿し", "50", "美味しい", "色々");
$sushi->showFood();

echo "<br />test class2 <br />";
$ramen = new Food("ラーメン", "300", "濃厚な豚骨味", "ちゃいろ");
$ramen->showFood();

echo "<br />test class3 <br />";
$chocolate = new Food("チョコレート", "50", "あまーい", "ブラウン");
$chocolate->showFood();

このようにクラスを使用することで、再利用が簡単にできます。

動作確認

想定通りの結果が出力されているか確認してみましょう。前回作成した環境を立ち上げます。
food_class.phpの編集が終わったら、保存して下記にアクセスします。

http://localhost:8080/food_class.php

想定した結果が返ってきました!

おわりに

クラスを使用したプログラムを見ていきました。
なんとなくイメージが掴んでいただけたのではないでしょうか。

Laravelなどのフレームワークを使用するときには
大体はクラスを使って、コントローラーやモデルファイルが作られているのでクラスについても押さえておきましょう。

クラスについても理解しておくことで、フレームワークで作られたファイルやフレームワーク内部についても理解しやすいです。

参考

公式ドキュメント – class
PHP: クラスの基礎 - Manual

コメント

タイトルとURLをコピーしました