【PHP】クラスと関数の違いは?そもそもクラスって何?

PHP

PHPの勉強をしているとクラス関数というものが出てきます。とっても大切なものなのですが、
ぶっちゃけ違いが分かりにくいと思います。

そんな疑問に答えていこうと思います。
目次は以下のようになります。
この順序でPHPのクラスと関数の違いを解説していきます。

スポンサーリンク

クラスって何?

クラスはざっくばらんに言うと値を保持する変数の役割処理をまとめる関数を合わせたものです。

 クラス = 変数 + 関数 

このままだと、クラスは変数と関数の集まりなだけで、わざわざクラスなんか使う意味があるの?ってなりますよね。

ここで早速、クラスと関数の違いを話していきたいのですが、いくつか知っていて欲しい用語がいくつかあります。
それはクラス内における変数と関数の名称「インスタンス化」についてです。知っている人は飛ばしてくれてかまいません。

クラス内における変数と関数の名称

変数はクラス内に記述されるとプロパティと呼ばれ、関数はメソッドと呼ばれるようになります。今後はこのように呼び方を区別しますので、覚えてください。

  • 変数→プロパティ
  • 関数→メソッド

ここでクラスの構文を示します。

class クラス名 {
    $プロパティ名

    function メソッド名(引数) {
    }

インスタンス化について

次にインスタンス化についてです。
クラスは例外を除いて直接実行することができません

それはクラスは一般的なものだからです。なので一般的なものから1つの具体例にすることによってプログラムを実行できるようにします。この具体化することをインスタンス化と呼びます。

クラスからインスタンスを作成する構文は以下のようになります。

$変数名 = new クラス名(引数)

なぜこのような2度手間を踏むのかの理由はクラスと関数の違いを話した後にしますね。

ここで、実際にクラスを作成し、インスタンス化してみましょう。

// クラスを作成
class Phone {
    public function call() {
        echo '電話をかけます';
    }
}

// インスタンスを作成(インスタンス化)
$iphone = new Phone();

functionの前にpublicというものが出てきました。
これはアクセス修飾子といいます。
詳しくは以下の記事を参考にしてくれるとうれしいです。

さて、話を戻しましょう。
とりあえず、今までの説明からコードの意味は分かると思います。 しかし、実行結果はどのようになるでしょう?

答えは何も表示されません。

上記ではインスタンス化したあとに、変数$iphoneに代入しているだけです。
「電話をかけます」を表示させるためには代入したインスタンスのcallメソッドにアクセスしなけばなりません。

アクセスするためにはアロー演算子を用います。
アロー演算子を知らない方は以下の記事を参考にしてください。

アロー演算子の使い方は以下になります。

$インスタンスを代入した変数名->呼び出すインスタンスのプロパティまたはメソッド名

よってcallメソッドの呼び出し方は

// クラスを作成
class Phone {
    public function call() {
        echo '電話をかけます';
    }
}

// インスタンスを作成(インスタンス化)
$iphone = new Phone();

// アロー演算子でインスタンスメソッドへアクセス
$iphone->call();

上記のようにインスタンスからメソッドを呼び出すときにはアロー演算子を使ってください。

関数とクラスの違い

さて、ようやく関数とクラスの違いについてお話しています。
長らくお待たせしてすみません。

以下に関数とクラスで同じ処理を書きました。
これを見て関数とクラスの違い、クラスの利便性を理解していきたいと思います。

<?php
function test()
{
    $num1 = 1 + 1;
    echo $num1;
}

test();

class TestClass {
   function __construct() {
       $this->num2 = 1+1;
   }

   public function con() {
       echo  $this->num2 ;
   }
}

$calc = new TestClass();
$calc->con();

上記の例ではどちらも「1+1」を計算してその結果の「2」を出力しています。

ですが、処理の過程が関数とクラスによって違います。
それを知るために、それぞれの「1+1」の演算に注目してみましょう。

関数test();では実行するたびに「1+1を計算し、結果の2を出力」しています。
それに対し、クラスTestClassでは「インスタンス時に1+1を計算し、結果の2をnumに保存」しています。

test関数1+1を計算し、結果の2を出力
TestClassクラスインスタンス時に1+1を計算し、結果の2をnumに保存

こうすることにより、col()メソッドを実行する時には「2を出力するだけ」になります。

よって、関数は「データの保持ができない」、逆にクラスは「インスタンスの内部にデータが保持できる」ということが関数とクラスの大きな違いになります。

関数 データの保持ができない
クラス インスタンスの内部にデータが保持できる

クラスの利便性

これによるメリットですが、例えば最近の美麗な3Dゲームのオブジェクトの演算の処理量は膨大です。

人間キャラクター1つをとっても、動き方、それに追随する影の動き、など色々処理があると思います。
なので、一度生成したデータをどこかに保存しないと、動作ごとにキャラクターを生成しなければなりません。これではとても処理が追いつきませんよね。

しかし、インスタンスにデータを保持するクラスを作ればこの問題は解決します。

また、クラスはインスタンスを作ってから処理を行います。これはあるものを複製しやすいということです。 ゲームでは様々な人間キャラクターがでるため、クラスの基本的な構造はとても役立ちます。

以下の表に変数と関数、クラスの違いをまとめておきました。

データの保持データの処理
変数 ×
関数 ×
クラス

終わりに

今回はクラスについての説明と、クラスと関数の違いを解説しました。
この記事が理解の一助になってくれたなら幸いです。

最後まで読んでくださってありがとうございました。

コメント

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