オブジェクト指向
プロパティ
インスタンス
メソッド

phpの基本を学んでみよう2(オブジェクト指向の基本)

phpの基本を学んでみようシリーズ2

今回はオブジェクト指向-セッターまでです。


著者略歴

名前:YUUKI

ポートフォリオサイト:Pooks

現在:Webエンジニア見習い


オブジェクト指向


  • オブジェクト = もの

  • 指向 = 〜を中心に

つまり、ものを中心にした考え方

例えばECサイトを作るときは、

「商品」「ユーザー」「カート」などのそれぞれのオブジェクトを用意し、

各オブジェクトに応じたデータを入れ、それらを組み合わせて1つの「ECサイト」を作る、というような考え方。

プログラムでも、それぞれの役割に応じたプログラムをモジュール化し、組み合わせて1つのプロダクトを作る。


クラス


  • オブジェクトの設計図

  • クラスを元に「オブジェクト」を作る

  • class名は大文字にする(Menuとか)
    書き方

<?php

class Menu{
//ここに処理を書く
}

?>


インスタンス


  • クラスを元に生成された実体

  • クラス外に書く

  • new クラス名()と書く

  • 生成したインスタンスは変数に代入する

書き方

<?php

class Menu{
}

// インスタンスを生成する
$menu1 = new Menu();

?>


プロパティ


  • インスタンスが持つデータ

  • クラス内に定義する

書き方

<?php

class Menu{
//プロパティを生成する
public $name
}

?>


プロパティへのアクセス

<?php

class Menu{
public $name;
}

$curry = new Menu();
// プロパティにアクセスする
$curry->name = 'CURRY';

?>


メソッド


  • インスタンスに関連する関数

  • それぞれのインスタンスが持つ関数

使い方

<?php

class Menu{
// メソッドの定義
public function hello(){
echo '私はMenuインスタンスです';
}
}

?>


メソッドへのアクセス

<?php

$curry = new Menu;
// メソッドにアクセスする
$curry->hello();

?>


$this


  • メソッド内で「インスタンスのプロパティ」や「メソッドにアクセスしたい」時に使う特殊な変数

  • class内のメソッド内でのみ使用可

  • メソッドが呼ばれた時に、そのメソッドを呼び出しているインスタンスに置き換えられる

書き方


index.php

<?php

class Menu{
public $name;
public function hello(){
// $thisでプロパティ呼び出し
echo '私の名前は'.$this->name.'です';
}
}
?>


index.php

$curry = new Menu();

$curry->name = 'CURRY';
// メソッド出力
$curry->hello();


コンストラクタ


  • 定義するとnewを用いてインスタンスを生成した際に自動的に呼ばれる特別なメソッド

書き方

<?php

class Menu{
// Menuクラスのインスタンス生成時に自動で呼ばれる
public function __construct(){
echo '1つのメニューが作成されました';
}
}

// インスタンスを生成し、コンストラクタメソッドを呼びだす
$curry = new Menu():
?>


コンストラクタと引数


  • __constructメソッドは引数を取れる

  • newを用いてインスタンスを生成する際には、引数を与えられる

  • 引数の値が__constructメソッドに渡される


コンストラクタとプロパティ


  • __constructメソッド内で、$thisを用いてインスタンスのプロパティに値をセットできる

書き方

public function __construct($name){

// 渡された引数の値をnameプロパティにセット
$this->name = $name;
}


HTMLにPHPを埋め込む


  • phpのコードを埋め込むことで、「HTMLのコードとPHPのコード」を切り分けることができ、見やすくなる

書き方


<p>
<?php
// pタグの中にphpコードを埋め込む
echo $curry->name
?>
</p>


foreach文をHTMLに埋め込む


  • 「{」の代わりに:、「}」の代わりに「endforeach」と記述

  • :とendforeachの中に処理を書く

書き方

<?php

$words = array('apple','banana','orange');
?>

<?php
// {の代わりに:を使う
foreach($words as $word):
?>
<!-- phpタグ使用かつ1行なのでセミコロン不要/>
<p>
<?php echo $word ?></p>

<?php
// }の代わりにendforeachを使う
endforeach
?>


require_once


  • require_onceを用いると、別のphpファイルを読み込むことができる

  • require_onceで読み込んだファイルで定義されている「クラス」や「変数」を、require_onceを記述したファイル内で使用可能

例:

- menu.phpにMenuクラスを定義

- data.phpに変数を定義

- index.phpで変数の値を出力する


menu.php

<?php

class Menu{
public name;
}

public function __construct($name) {
$this->name = $name;
}

?>



data.php

<?php

// menu.phpを読み込む
require_once('menu.php')
// Menuクラスを読み込んでるので、インスタンス生成が可
$curry = new Menu('CURRY');
?>


index.php

<?php

// data.phpを読み込む
require_once('data.php')
<p>
//
<?php echo $curry->name ?>
</p>
?>


画像を表示


  • imageプロパティの値をsrc属性に指定するため、``の中に埋め込む

  • echoを入れて出力結果を反映させる

<img src="<?php echo $curry->image ?>" >

出力結果

<img src="imageプロパティの値">


floor


  • 小数点以下を切り捨てる関数

<?php

public function getTaxIncludePlice(){
// priceプロパティに1.08を掛け、小数点以下を切り捨てた値を返す
return floor($this->price * 1.08);
}
?>


カプセル化


  • 使い手に必要ないものを隠してしまうこと

  • パソコンを例にしたイメージ


    • 操作しても安全な部品だけを公開

    • 操作すると安全ではない部品は非公開(内部にアクセスできない)



  • カプセル化の概念をクラス定義時に用いる


    • 共有する人に使って欲しい機能は公開

    • クラス外で使って欲しくない機能は隠す

    • 使える機能を制限することで、他の人はどの機能を使えばいいかが分かりやすく、安全にクラスを利用できる




publicとprivate(カプセル化)


  • カプセル化で「クラスのプロパティ」と「メソッド」へのアクセスを制限する


    • クラス外からアクセス→public

    • クラス外からアクセスできない→private

    • プロパティは基本的にこちらを使う




ゲッター


  • プロパティの値を返すだけのメソッド

  • 「getプロパティ」と命名する

使い方

<?php

class Menu{
// プライベートプロパティの定義
private $name;
public function __construct($name){
$this->name = $name;
}

public function getName(){
// プロパティの値を返す
return $this->name;
}
}
?>


セッター


  • プロパティの値を変更するメソッド

  • 「setプロパティ名」と命名する

書き方


menu.php

<?php

class Menu{
private $orderCount;
public function setOrderCount($orderCount){
$this->orderCount = $orderCount;
}
}

$curry = new Menu('CURRY', ...);
// セッターを用いて値をセット
$curry->setOrderCount(3);

echo $curry->getOrderCount();

// privateの為、直接アクセスできない
$curry->orderCount = 4;
?>



プロパティは定義時に初期値をセットできる

class Menu{

private $orderCount = 0;
public function getOrderCount(){
return $this->orderCount;
}
}