notebook510

備忘録とか覚え書き的なところを想定しています

PHP入門 第8回 クラス、

 

PHP入門のラストはオブジェクト指向。

 

まず概念として、

  • オブジェクト ⇒ 物体
  • クラス ⇒ 設計図

と考え、クラス(設計図)があることで、
オブジェクト(物体)を大量生産できる・・・

という解説でした。

 

 

オブジェクト指向とは?

オブジェクトをデータ振る舞い(動作)に分けて考えること。

そして、それをカプセル化と呼びます。

 

講座では車の設計図を例に解説してました。
車のデータと、車の動作に分ける感じです。

データ 

  • タンク容量
  • 残ガソリン量

 

動作

  • 走る
  • 止まる
  • 給油する

 

上記を踏まえて、PHPを構築します。

1.クラスの定義

<?php
class Car{
public $color;
public $tank_capacity;
public $oil;

function Run(){
//何らかの処理
}
}

2.上記に続いて、オブジェクトを作成

 $car1 = new Car();

3.続いて、オブジェクトのデータ設定

$car1->color = "blue";
$car1->tank_capacity = 50;
$car1->oil = 5;

 

 

上記の1、//何らかの処理 の箇所に振る舞い(動作)を定義します。

1-b.クラスの定義、そして動作定義

<?php
class Car{
public $color;
public $tank_capacity;
public $oil;

function Run(){
$this->oil--;
}
}

上記の$this->は、クラス名のCarにかけて「この車の」を表しています。
 $this->oil とすることで「この車のオイル」と読むと分かりやすいと思います。
コードを書く際に oil に $ を付けません。

 

2-b.1-bに続いて、オブジェクトの作成から実行まで

$car1 = new Car();
$car1->color = "blue";
$car1->tank_capacity = 50;
$car1->oil = 5;
$car1->Run();

3-b.続いて、実行結果を表示

echo $car1->oil;

 

クラスの名称

<?php
class Car{
public $color;
public $tank_capacity;
public $oil;

 publicで始まるコードを、プロパティメンバ変数などと呼びます。

function Run(){
$this->oil--;
}
}

functionからのコードで定義されるものを、メソッドメンバ関数などと呼びます。

 

1-bから3-bまでのコードをまとめます。

<?php
class Car{
public $color;
public $tank_capacity;
public $oil;

function Run(){
$this->oil--;
}
}

$car1 = new Car();
$car1->color = "blue";
$car1->tank_capacity = 50;
$car1->oil = 5;
//$car1->Run();
$car1->oil--;
echo $car1->oil;

 

$car1->Run(); をコメントアウトして、
$car1->oil--; と記述する事でプロパティの
データを直接編集できます。

直接編集できるのは、プロパティの$Oilが、publicで記述されているから。

 

<?php
class Car{
public $color;
public $tank_capacity;
private $oil;

function Run(){
$this->oil--;
}
}

これが上記のように、private $oil; と書くと
$car1->oil--; の記述はエラーになります。

 

public、private、protected の違い

 

  • public・・・どこからでもアクセス可能
  • private・・・そのクラスのメソッドからアクセス可能
  • protected・・・そのクラスとサブクラスのメソッドからアクセス可能

 

protectedは、privateより制限が緩い感じ、だそうです。

<?php
class Car{
public $color;
public $tank_capacity;
private $oil;

function Run(){
$this->oil--;
}
}

$car1 = new Car();
$car1->color = "blue";
$car1->tank_capacity = 50;
$car1->oil = 5;
$car1->Run();
//$car1->oil--;
echo $car1->oil;

上記コードの中で、

$car1->color = "blue";
$car1->tank_capacity = 50;

ここは、$colorも$tank_capacityもpublicだからOKだけど、


$car1->oil = 5;

これは、privateだからエラーになる

 

エラーを回避するには、privateプロパティにデータを
設定するためのメソッドを用意する必要があります。

<?php
class Car{
public $color;
public $tank_capacity;
private $oil;

function Run(){
$this->oil--;
}
function setOil($data){
$this->oil = $data;
}
function getOil(){
return $this->oil;
}

}

$car1 = new Car();
$car1->color = "blue";
$car1->tank_capacity = 50;
//$car1->oil = 5;
$car1->setOil(5);

$car1->Run();
//$car1->oil--;

//下の1行もエラーになる。(直接アクセスしているため)
//echo $car1->oil;
echo $car1->getOil();
?>

 

クラスの継承

Carクラスにプラスして、プロパティを設定するコードです。

extend が継承を表してます。

 

<?php
class Car{
public $color;
public $tank_capacity;
public $oil;

function Run(){
$this->oil--;
}
function setOil($data){
$this->oil = $data;
}
function getOil(){
return $this->oil;
}

}

class Truck extends Car{
public $loadage;//積載量

function Load(){//積む関数
//なんらかの処理
}
function UnLoad(){//荷降ろし関数
//なんらかの処理
}

}

$truck1 = new Car();
$truck1->color = "blue";
$truck1->tank_capacity = 50;
$truck1->setOil(5);
$truck1->Run();
echo $truck1->getOil();
?>

 class Truck extends Car と書くことで、Carクラスを
引き継いで、新たにpublic $loadage; のプロパティを追加しています。

 

ここまで、サンプルコードを引用しつつ振り返ってみたけど、
理解するのに時間がかかりそうです。

 

とりあえず、何となく概念は分かったので、クラスを使う機会が
あるまでコードを書いてみたいと思います。