PHPのクラス、オブジェクト思考についてのわかりやすい説明(図解)

PHPのクラスについて PHP/MySQL
  1. 関数とは
  2. 変数とは
  3. PHPでクラスとは何か
    1. オブジェクト指向とは
    2. クラスは、インスタンス生成をして実行
  4. クラスと関数の違いとは
  5. PHPでのクラスの使い方とクラスの継承とは
  6. クラス継承(拡張)する、extends(拡張名)関数
  7. アクセス修飾子の、public、protectedで利用範囲を指定する
    1. global関数
    2. $_POSTはスーパーグローバル変数
    3. スーパーグローバル関数の使い方
  8. Staticで、インスタンス無しでクラスにアクセスする
    1. PHPのclassでstaticを使う方法
    2. PHPの変数(プロパティ)でstaticを使う方法
  9. クラスを「Interface(オブジェクト インターフェイス)」宣言するメリット
    1. インターフェイス導入の考え方
    2. Interfaceクラスからfunction処理名を統一する
  10. Interface実装方法
    1. class側に「implements(実装)+ (インターフェイス宣言の名称)」
  11. 異なるクラス、同じ関数名のfunction処理をインターフェイス1つで実行
  12. 1つのクラスで複数のインターフェイスを実装する多重継承とは
    1. インスタンスで「多重継承」が可能な理由
  13. 抽象化クラスとは
    1. 抽象化クラスはインスタンス生成出来ない
  14. Interfaceインターフェイスとabstract抽象化の使い分け
  15. 関数をabstract(抽象化)する方法
    1. abstract(抽象)はクラスだけではなく、関数(メソッド)でも利用出来る
  16. 引数として使う無名クラスの使い方

関数とは

関数とは、あるデータを受け取り、定められた独自の処理を実行し、その結果を返す命令のことです。 「function xxxx {}」など処理命令が記載されたもの。

変数とは

変数は、数値でも文字列でも入れることが出来る名前をつけたものです。 変数名は変数の名前(lang)は自由に決める事ができます。

PHPでクラスとは何か

関数と変数を、パッケージにしたものを「クラス」といいます。「クラス」や「関数」などのプログラムの構造部分(処理の命令文)が記載されたものを「オブジェクト」といいます。

オブジェクト指向とは

「オブジェクト」を、なるべく、まとめて「カプセル化」しておくことです。 PHPのクラス、オブジェクト思考についてのわかりやすい説明(図解)、説明画像1 例えば、このサイトのような記事ページを表示する場合、まずページのURLをチェックします。URLから該当のデータが保存されているidを取出します。データベースにアクセスします。データベースからデータを呼び出します。HTML用に整形します。ページにHTMLとして表示ます。この一連の流れの変数と関数を「クラス」にまとめてしまうと、わかりやすいですよね。クラスはこういった、まとまりにしたいものがあるときに利用します。

クラスは、インスタンス生成をして実行

クラスで、パッケージ化しておき、「インスタンス生成」の後に「実行」するだけで終わるように設計していきます。 PHPのクラス、オブジェクト思考についてのわかりやすい説明(図解)、説明画像2

クラスと関数の違いとは

function(引数)で処理を行い、retrnで返値を受け取れば、大抵のことが出来てしまいます。クラスを利用しなくても、関数と変数のみでブログ・サイトぐらいはつくることが出来ます。 クラスを作る意味があるのかも検討してみましょう。単純にページのURLを取得するだけなどの単純なプログラムなど、クラスにしないほうがいいプログラムもあります。クラス化のmeritは、クラス名でインスタンス変数から、クラス内の変数を呼出すので、クラスが違うなら同じ変数名を別のものとして使うことが出来る点です。nameやtextなどの変数名が被るような場合は、クラス化しておくのもよいと思います。 クラスは主に、データ容量が大きいものほど重宝します。プログラムが膨大になりがちな、ゲームを制作する場合は、このクラスが大活躍します。ある程度の関数がまとまったら、クラス化しておくと、プログラムの構造がすっきりみやすくなります。
クラスと関数の違い
データ処理 データ格納
変数 処理は出来ない データ格納は出来る
関数 処理のみ可能 データ格納が出来ない
クラス 処理が可能 クラス内に変数をつくりデータ格納可能
無名クラス (使い捨てのクラス) 処理のみ可能 データ格納が出来ない

PHPでのクラスの使い方とクラスの継承とは

クラスを制作していたところ、追加でクラスを付け足したい場合、親となるクラスに、拡張という形で「子クラスを継承」することができます。追加したいクラスに「”extends” と(拡張名したい元クラス名)」を記載をするだけです。

クラス継承(拡張)する、extends(拡張名)関数

class (子クラスB) extends (親クラスA) {……} 別ファイルに記載のクラスも拡張する事ができる。親クラスに子クラスが自動で含まれる。classAを実行すると、子クラスのBが実行可能になる。 クラスについては、わかりやすくまとめた、以下の図を参照ください。 PHPのクラス、オブジェクト思考についてのわかりやすい説明(図解)、説明画像3 PHPのクラス、オブジェクト思考についてのわかりやすい説明(図解)、説明画像4

アクセス修飾子の、public、protectedで利用範囲を指定する

どの範囲でアクセス可能にするかを、publicとprivateの利用範囲を定義できます。何も定義しなければ「purblic」扱いになります。 PHPのクラス、オブジェクト思考についてのわかりやすい説明(図解)、説明画像5

global関数

クラス外にある変数を読込したい場合は、「global」宣言を行い変数を利用することができます。

$_POSTはスーパーグローバル変数

<form>タグで使われる¥$_POST関数は、「スーパーグローバール変数」とよばれ、定義したり、ページを読込しなくても、どこからでも呼び出しすることができる変数です。formタグの「name=”値”」を自動的にキーとして配列としてデータが格納されています。

PHP


//スーパーグローバル変数は9種類
//連想配列になっている。
$GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV

スーパーグローバル関数の使い方

PHPのクラス、オブジェクト思考についてのわかりやすい説明(図解)、説明画像6

Staticで、インスタンス無しでクラスにアクセスする

JAVA言語で頻繁に利用するStaticはPHPでも使用できる。「static」は(静的)を意味する。クラスをStatic宣言するか、クラス内の関数にStatic宣言をしておくと、インスタンス無しでクラスへのアクセスが可能になる。 参考:PHP日本語マニュアル PHP日本語マニュアルがわかりやすいので、ここでは画像で補足します。以下の図を参照ください。

PHPのclassでstaticを使う方法

PHPのクラス、オブジェクト思考についてのわかりやすい説明(図解)、説明画像7

PHPの変数(プロパティ)でstaticを使う方法

PHPのクラス、オブジェクト思考についてのわかりやすい説明(図解)、説明画像8

クラスを「Interface(オブジェクト インターフェイス)」宣言するメリット

処理方法や取得方法は全然違うけれど、関数処理後の結果が同じ形式になるものなら、「インターフェイス・オブジェクト」を検討してみる。

インターフェイス導入の考え方

処理結果に合わせて、処理名を統一してわかりやすくする。 PHPのクラス、オブジェクト思考についてのわかりやすい説明(図解)、説明画像9

PHP


//例
//関数名に合わせて実行を記載する

Class WordPress(){
	function WordPress_Data(){
	  $post = $getData["post"];//投稿したブログ記事
	 return $post ;
	}
//
$blog1 = new WordPress;//インスタンス生成

Class Gost_Blog{
	function Gost_Contents_acsess(){
	  $blog = $input["content"];//投稿したブログ記事
	 return $post ;
	}
}//
$blog2 = new Gost_Blog;//インスタンス生成

//ブログデータ取得処理実行には...
$blog1->WordPress_Data();
$blog2->Gost_Contents_acsess();

上記の場合は、処理実行コードは関数名に合わせて記載します。 インターフェイス宣言にすると以下のように、実行する関数名が同じになりわかりやすい

PHP


//例
//処理実行に合わせて関数名を統一する

Class WordPress{
	function Blog(){
	  $post = $getData["post"];//投稿したブログ記事
	 return $post ;
	}
//
$blog1 = new WordPress;//インスタンス生成

Class Gost_Blogo{
	function Blog(){
	  $blog = $input["content"];//投稿したブログ記事
	 return $post ;
	}
}//
$blog2 = new Gost_Blogo;//インスタンス生成

//ブログデータ取得処理実行
//すっきり、わかりやすい
$blog1->Blog();
$blog2->Blog();

Interfaceクラスからfunction処理名を統一する

Interface実装方法

implements 関数はことばの通り「実装」を意味します。Interfaceとimplements 関数をセットで利用します。

class側に「implements(実装)+ (インターフェイス宣言の名称)」

インターフェイス側で public メソッドを呼出す宣言をする。 interface宣言をすると「クラス+ interface宣言」のクラスの外から、クラス内のfunctionを実行する。 インターフェイス内で宣言される全てのメソッドはpublicである必要がある。 PHPのクラス、オブジェクト思考についてのわかりやすい説明(図解)、説明画像10 インターフェイス側に記載されているfunctionは宣言だけの「抽象メソッド」で、処理のインスタンス(実行)を行うクラスが必須になる。インターフェイス側、function関数名を宣言するだけで、関数の実行の処理内容は記載することは出来ない。

PHP



//インターフェイス定数は クラス定数 とまったく同じように動作する。
//以下のようにクラス内に同じfunction処理を記載する。
//つまり使おうか使わまいが、SetVariable、 GetHtmlが記載されていないとインターフェイスは動作しない。


// インターフェイスを宣言する
interface (インターフェイス名iTemplate)
{
    public function SetVariable($name, $var);
    public function GetHtml($template);
}//



//クラス名とimplementsで実装名を記載
class (クラス名Template) implements (実装インターフェイス名iTemplate){

	public function SetVariable($name, $var){

	}//end_functipn


	public function getHtml($template){
	
	}//end_functipn

}//end_class

異なるクラス、同じ関数名のfunction処理をインターフェイス1つで実行

異なるクラスで使用している同じ関数名をまとめて実行できる。

PHP


//--------------------
//インターフェイス宣言
//-------------------
interface Fruits {
	function applyPriceDown();
	 function getPrice();
	//public function setPrice($price);
}

//-------------
//クラス定義
//------------

// りんごクラス
class Apple implements Fruits {
	private $price = 1000;
	 function applyPriceDown() { // 常に2割引
		$this->price = $this->price * 0.8;//8割の価格
	}
	 function getPrice() {
		return $this->price;
	}
	 public function setPrice(){
		return "りんご¥";
	}
}//

// ぶどうクラス
class Grape implements Fruits {
	private $price = 2000;
	 function applyPriceDown() {
		if ('30' == date('d')) { // 30日なら半額
			$this->price = $this->price / 2;//価格を2で割る
		}
	}
	public function getPrice() {
		return $this->price;
	}
	  public   function setPrice(){
		return  "ぶどう¥";
	}
}//


//レモンクラス
class Lemon implements Fruits {
	private $price = 500;
	 function applyPriceDown() { 
	//値引なし=処理なし
	}
	public function getPrice() {
		return $this->price;
	}
	  public   function setPrice(){
		return  "レモン¥";
	}
}//

//------- 
//実行
//-------
$data1 = new Apple;//インスタンス化
$data2 = new Grape ;//インスタンス化
$data3 = new Lemon ;//インスタンス化
   $data1->applyPriceDown();//割引額計算
   $data2->applyPriceDown();
   $data3->applyPriceDown();


//※ひとつの変数にまとめる場合インスタンス宣言はわかりやすい。
$nedan = array();
$nedan = array(
	  $data1->setPrice().$data1->getPrice(),//商品名:価格を取得
	  $data2->setPrice().$data2->getPrice(),
	  $data3->setPrice().$data3->getPrice(),
	);


var_dump($nedan);

//実行結果
Apple:1000
Grape:2000
Lemon:500

1つのクラスで複数のインターフェイスを実装する多重継承とは

インスタンスで「多重継承」が可能な理由

※複数インスタンスでfunction関数名が重複していても、インスタンスではクラス”外部からのfunction処理へアクセスが可能ですよ”と宣言しているだけ。インスタンス(実行)されるのはクラス側なので、function処理は結局のところ1回しか行わないので、インスタンス側で重複した記載があってもエラーにならない。

PHP


//----------------------
//インターフェイス宣言
//----------------------
interface hoge {
    public function t1();
    public function t2();
}

interface foo {
    public function t2();
    public function t3();
}


//-----------------------------
//インスタンス(実行)側クラス
// hogeとfooを多重継承してみる
//-----------------------------
class bar implements hoge, foo {
    public function t1() {
        echo "bar's t1()\n";
    }
    public function t2() {
        echo "bar's t2()\n";
    }
    public function t3() {
        echo "bar's t3()\n";
    }
}//
$shori = new bar ;//インスタンス生成

//------------------------------
//インスタンス宣言で重複があっても実行されるのは1回
//------------------------------
$shori->t1();  //function処理
$shori->t2();  //function処理
$shori->t3();  //function処理

下記に記載の「アブストラクト abstract(抽象の意味)」では、宣言以外にもメソッド(function処理)の追加記載が出来るので、1つのクラスにアブストラクトが複数存在するとエラーが起きる。そのため、1つのクラスで単一のアブストラクトしか利用出来ないようになっている。

抽象化クラスとは

インターフェイスでも出てきた「抽象化クラス」とは、function処理を宣言しただけで、実際の処理の記述を記載していないクラスのこと。インターフェイス以外にも、「abstract(抽象)」がある。

抽象化クラスはインスタンス生成出来ない

抽象クラスとは、他のクラスで継承してもらうことを前提としたクラスで、抽象クラスをインスタンス生成することは出来ない。 インターフェイスと違い、「abstract(抽象)クラス」は、通常のクラス同様、プロパティやメソッドを実装可能。インスタンス化(実行)が出来ないので継承されるクラスは必須。
interfaceとabstractの違い
インターフェイス interface (異なる2つのものを仲介の意味) アブストラクト abstract (抽象的なという意味)
抽象化クラス (インターフェイス自体を、インスタンス実行出来ない) 抽象化クラス (アブストラクト自体を、インスタンス実行出来ない)
クラス側にimplements(実装)を記載 クラス側にextends(拡張)を記載
インターフェイスの定義は、複数の異なるクラスの関数を記載できる アブストラクトで定義を記載できるのは、単一のクラス内の関数のみ
多重継承がOK 実行側クラスでの 複数インターフェイスを利用可 継承は単一のみ 実行側クラスは 1つのアブストラクトのみ
インターフェイス宣言内の関数はクラス側に必須で記載。(無い場合はエラーになる) アブストラクト宣言内の関数は、クラス側になくても問題ない。
全てpublic public、protectedが利用可
関数名の定義のみ。 実装処理内容は記載NG 関数名と合わせて処理記載もOK ※処理の実行は出来ない

Interfaceインターフェイスとabstract抽象化の使い分け

Interfaceインターフェイスとabstract抽象化の使い分けは、宣言した関数(function)処理が必須でないとエラーが出る点。 PHPのクラス、オブジェクト思考についてのわかりやすい説明(図解)、説明画像11

PHP


//------------------
//継承クラスで、親クラスが概要クラスとして定義された場合
//-------------------

//---------------------
//親クラス:概要クラス定義
//---------------------
abstract class AbstractClass
{
    // 抽象メソッドでは、必須の引数だけを定義しています
  // publicだけではなく、protected宣言も出来る
    abstract protected function prefixName($name);
}//

//-------------------------------------
//クラス + 継承extendsするクラス名
//-------------------------------------
class ConcreteClass extends AbstractClass
{

    // 子クラスでは、親のシグネチャにないオプション引数を再定義することもできる
    public function prefixName($name, $separator = ".") {
        if ($name == "Pacman") {
            $prefix = "Mr";
        } elseif ($name == "Pacwoman") {
            $prefix = "Mrs";
        } else {
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}//

//インスタンス生成
$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";


//上の例の出力は以下となります。
//
//Mr. Pacman
//Mrs. Pacwoman

関数をabstract(抽象化)する方法

abstract(抽象)はクラスだけではなく、関数(メソッド)でも利用出来る

PHP


abstract class BaseUser{
  //通常のクラス同様、プロパティやメソッドを定義
  public $age = 55;
  public function showAge($age){
    echo $age;
  }
  //抽象メソッド
  abstract public function showName();
}

class User extends BaseUser{

  function __construct(){
      $this->showName();
      $this->showAge($this->age);
  }

  public function showName(){
    echo 'SATO ';
  }
}

$user = new User();//SATO 55

引数として使う無名クラスの使い方

「無名クラス」は、文字の通り、名前がないクラス。 クラス内に変数がなく(データ保存しておくべき値がない)処理だけのときは無名クラスとして引数を利用してインスタンス(実行)が出来る。 PHPのクラス、オブジェクト思考についてのわかりやすい説明(図解)、説明画像12
タイトルとURLをコピーしました