fbpx
  1. HOME
  2. ブログ
  3. エンジニアになろう!
  4. クラスから理解するPHPのオブジェクト指向

クラスから理解するPHPのオブジェクト指向

そもそもPHPでのオブジェクト指向とは

そもそもPHPの開発でよく耳にする「オブジェクト指向」とは、どのようなものなのでしょうか?

このオブジェクト指向の意味が分かっていない状況では、オブジェクト指向の理解も進まないことでしょう。

まずは、オブジェクト指向を学ぶにあたり、『PHPでなぜオブジェクト指向が必要とされているのか?』また『オブジェクト指向を理解するにあたり何から理解すると良いのか?』をご説明します。

クラスを中心とした概念で構成される

オブジェクト指向は、クラスと呼ばれる概念で構成される考え方です。

PHPで記述したクラスを作成し、それを用いてオブジェクトを作成するプログラミング法です。

クラスについて例えると、「設計書」とよく言われています。

オブジェクト指向で最初に覚えるべき4つのキーワード

ちなみに、オブジェクト指向を理解するにあたり、最初に覚えるべき4つのキーワードがあります。

  1. クラス
  2. メソッド
  3. プロパティ
  4. インスタンス

オブジェクト指向には色々なキーワードが出てきますが、PHPでオブジェクト指向を理解するにあたり最初は、この4つで十分です。

クラス

クラスは、オブジェクトを作るためのテンプレートとなるものです。

クラスの中には、変数や関数などが含まれています。

テンプレートであるクラスを利用して、後ほどご説明するオブジェクトを作成していきます。

クラスを作ってみよう

今回は、メディア編集部の独断で、「ガンダム」を例に説明していきます(笑)

では、早速ですが、ザクⅡを作ってみましょう!

名前ザクⅡ
大きさ17.5m
重量56.2t
行動歩行、スラスターを使う、しゃがむ

これを元にすると、以下のようなクラスを考えることができます。

クラス ザクⅡ{
・・大きさ
・・
・・重量
・・行動
}

「ザクⅡ クラス」は、「大きさ」や「色」「重量」「行動」の情報を持っています。

そのため、このクラスが、例えば100体の「ザクⅡ」を作るという際にも、すべての下地(テンプレート)となるわけです。

実際にコードで書いてみると

class zaku2の中に、ザクⅡの構成が含まれています。

簡単に表現すると、クラスとは「変数」や「関数」を1つにまとめて設計書を作成したものです。

メソッド

クラスの中で定義された「関数」のことをメソッドと呼びます。

上記コードで言うと、ここの部分です。

基本的な動きは、PHPで定義されるその他の関数と同じであると理解して問題ありません。

メソッドは関数ですので、その役割はクラスの中で何かしらの行動を定義することができます。

メソッドが存在することで引数によって計算結果が変わるなど同じクラスから生まれたものでも、異なった結果を生み出せるようになります。

プロパティ

クラスの中で定義された「変数」のことをプロパティと呼びます。

上記コードで言うと、この部分です。

クラスの中で定義されている場合のみ、プロパティと独自の名前がついています。

変数ですので、基本的には皆さんがイメージするとおりで、クラスの中で動的に変更される数値などを扱います。

プロパティがあることで、クラス内で様々な変数を管理できます。

インスタンス

設計図にあたるクラスを利用して、実際に「オブジェクト」を作成したものをインスタンスと呼びます。

インスタンスを作成することで、具体的にPHPで様々な作業をオブジェクトに任せられるようになります。

オブジェクトの作成方法

具体的にオブジェクトを作成する方法を確認していきましょう。

オブジェクトを作成する場合、以下のように新しいオブジェクトを作成します。

これで「新しく $a に(class名)のオブジェクトを作成する」という意味になります。

ザクⅡのオブジェクトを作成する

先程のザクⅡのオブジェクトを作成するのであれば、以下の記載になります。

これで、変数 $a に先ほど定義した zaku2 が作成されます。

最初は、zaku2というクラスで「ザクの設計書」だけしか作られていませんでした。

プログラムでは、設計書だけが定義されていても、具体的には何も処理はできません。

しかし、今回は $a  という変数に、設計書を元に作った「実際のザクⅡ」を格納しました。

変数に格納すると、図の通り、設計図ではなく形に変わったもの(オブジェクト)が作られるのです。

オブジェクト指向の3大要素を理解する

オブジェクト指向を理解するためには、クラスを理解することが不可欠です。

それは、クラスを理解することでオブジェクト指向の概要を把握することが可能だからです。

また、オブジェクト指向を理解することで、同時にオブジェクト指向の3大要素と呼ばれている大きなメリットを得ることができます。

オブジェクト指向の3大要素とは、「カプセル化」「継承」「ポリモーフィズム」の3つの要素を指します。

次の章では、それらについてご説明していきたいと思います。

カプセル化

オブジェクト指向を利用するメリットにカプセル化が挙げられます。

皆さんは、「カプセル」と聞くと「薬のカプセル」「カプセルトイ」などが浮かんできたかと思います。

まさに、この「カプセル化」もこのようなイメージであり、「中身を隠す」という機能です。

中身を隠したいときに使う

中身を隠すことによるメリットは、PHPの細かなプログラム内容を外に知られることが無くなるということです。

プログラムの内容は、外部に知られない方がセキュリティ上も安心です。

もし、知られてしまうと悪用されたり攻撃を受けてしまったりする可能性がでてきてしまうからです。

また、開発の面のメリットとしては、複数人開発の際、誤って変数の内容を変更される心配もありません。

メリット

  1. ソースコードを見ない限り変数名が分からないため安全性が高まる
  2. クラスの利用者は引数のルールとアウトプットのルールだけを理解すれば良い
  3. クラスの中で処理を完結させられるため保守性が上がる

継承

継承とは、すでに用意されているクラスを、他のクラスを作成する時に活用する仕組みです。

クラスを作成する時に、同じことを何度もプログラミングしなくて良いように「継承」の仕組みが用意されています。

似たようなクラスを作成する際に、「継承」を利用すれば記述が簡略化できるのです。

書き方

PHPで継承を記載するときには、以下のような書き方をします。

既に作成してあった(元クラス)を利用して、それを継承した(新クラス)を作成する方法です。

(元クラス)となる部分に基本的な要素を詰め込んでおいて、それを継承して(新クラス)を作成すると、少しの変更だけで新しいクラスを作成できます。

仮に、(新クラスに追加したい内容)に何も記載しなければ、基本的には新旧どちらも同じクラスが完成します。

もちろん、(元クラス)を基礎に継承は実行されますので、こちらが参照できるようになっていなければ継承は利用できません。

注意しておきたいこと

なお、継承を利用するときには注意しておきたいこともあります。

それは、(元クラス)の全てを継承して(新クラス)が作成されるとは限らないことです。

これは、アクセス修飾子がどのように定義されているかに左右されます。

アクセス修飾子には、3種類あります。

アクセス修飾子の種類

  1. public:継承可能。アクセス修飾子の定義が無い場合にはpublic扱い。
  2. private:継承不可能
  3. protected:継承可能。privateとpublicの中間的存在であり、継承したクラスからは参照できる非公開な要素

上記の通り、アクセス修飾子がprivateであると継承が適用されません。

そのため、privateが含まれているクラスを継承する場合、全く同じクラスを基礎として新しいクラスが作成されるわけではありません。

継承できるものだけを利用したクラスが作成されます。

初心者のうちは、privateにしていることを忘れてしまい、継承ができないと戸惑ってしまうこともあると思いますので特に注意しておきましょう。

ポリモーフィズム

PHPでオブジェクト指向を利用するにあたり、理解に苦しんでしまう人も多いのがポリモーフィズムです。

ポリモーフィズムは、そのまま訳すと「多様性」などの意味を持っています。

ですが、いきなり「多様性」と言われても意味が分からないことでしょう。

ザクで例えてみる

ポリモーフィズムを、ザクで例えてみましょう。

ザクは、ガンダムに「攻撃」という行動をしているイメージがありますね。

しかし、攻撃の動作は、人それぞれでイメージが異なります。

例えば、「ザク・マシンガンで攻撃する人」もいれば、「ヒート・ホークを使う人」も、そして「クラッカーを使う人」もいることでしょう。

同じ行動をするものの、その後の動作が異なるという仕組みのことをポリモーフィズムと呼ぶと思ってください。

オブジェクト指向の世界では、同じメソッドを複数のクラスで利用してその動作が異なることをポリモーフィズムと呼びます。

Aさん、Bさん、Cさんというクラスが存在しそれぞれが「攻撃する」というメソッドを持っていたときに、それぞれ異なった動作をすると捉えてみましょう。

ポリモーフィズムを実装する

それでは、ポリモーフィズムについてコードを見てみましょう。

さて、実装された zaku2A 、 zaku2B 、 zaku2C のクラスを確認してみましょう。

そのどれもに「 attack 」と呼ばれるメソッドが実装されています。

しかし、それぞれのメソッドでは別々の行動が定義されています。

メソッド名は同じなのですが動作が異なるのです。

つまり、インスタンスを zaku2A で作成すれば attack では「ザク・マシンガンで撃つ」が実行されます。

インスタンスを zaku2C で作成すれば attack では「クラッカーを投げる」が実行されます。

どちらも同じ attack ではありますが、実行された結果が異なるのです。

これをポリモーフィズムと呼びます。

さて、気になった方もいると思いますが、コード内に、新しい用語が2つ出てきましたので、見てみることにします。

interface

まずは「interface」です。

こちらは、クラスと同じようにインスタンスを作るために定義するものです。

しかし、クラスとは異なる点がいくつかあります。

  1. interfaceからインスタンスの作成はできない
  2. アクセス修飾子はpublicしか利用できない
  3. 抽象メソッドしか定義できない

大きな特徴は、直接インスタンスの生成ができないことです。

これはクラスと大きく異なります。

インスタンスを作成できないため、interfaceで定義されているものからclassで定義されているものに継承しなければなりません。

implements

この継承に利用されているのが、2つめの用語である「implements」です。

ただ、上記でご紹介した継承と用語が異なります。

実は、interfaceからclassへ継承する場合には、継承ではなく実装と呼ばれる違う動作をします。

中身は同じような動きなのですが、継承と実装で言葉が使い分けられてます。

ポリモーフィズムを利用することのメリット

  1. 複雑な処理であっても、ポリモーフィズムを利用することで端的に記述できる
  2. プログラムの保守性という面でメリットが大きい
  3. クラスを細分化できる

ポリモーフィズムを利用することでPHPの記述内容がシンプルになりやすくなります。

また、クラスの細分化については、クラスの絶対数は多くなる傾向になります。

しかし、細分化されていることで他に与える影響が少なくなったり、保守性が上がりますので、メリットのほうが大きいといえるのです。

オブジェクト指向でPHPをさらに使いこなす

極端な話をすると、オブジェクト指向が使えなくともPHPでプログラムを書くことは可能です。

繰り返し利用するような内容であっても、同じことを都度書けば良いのです…。

しかし、オブジェクト指向を利用することで、複雑な記述をしなくても高機能なプログラムを作成することができるようになります。

初心者PHPプログラマから初心者オブジェクト指向プログラマに進化することで、あなたのプログラミング技術は飛躍的に高まるはずです。

一緒に働いてくれる仲間を募集しております!

ライトコードでは、仲間を募集しております!

当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。

また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!

なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。

ライトコードでは一緒に働いていただける方を募集しております!

採用情報はこちら

書いた人はこんな人

ライトコードメディア編集部
ライトコードメディア編集部
「好きなことを仕事にするエンジニア集団」の(株)ライトコードのメディア編集部が書いている記事です。

関連記事