PHP基礎メモその2

#クラス
オブジェクト指向では、クラスというオブジェクトの設計図を作成し、クラス（設計図）を元にオブジェクトを生成する。
>```php
<?php
// クラス名は大文字で始める
class Menu {
  // クラスの内容を書く
}
?>
```

#インスタンス
クラスを元に作成された実体を『インスタンス』と呼ぶ。インスタンスとオブジェクトは同じ意味で使われる。
インスタンスは『new』を用いて『new クラス名()』で生成できる。
『＄変数名 = new クラス名()』のようにすることで生成したインスタンスを変数に代入している。
>```php
<?php
class Menu {
  // クラスの内容
}
>
$menu1 = new Menu();
$menu2 = new Menu();
$menu3 = new Menu();
?>

#プロパティ
プロパティはインスタンスが持つデータのことで『public ＄プロパティ名』のように定義する。
>```php
<?php
class Menu {
  public $name;
  // nameプロパティを定義
}
?>
```

『インスタンス->プロパティ名』とすることでそのインスタンスのプロパティにアクセスすることができる（プロパティ名に＄は不要）。
>```php
<?php
class Menu {
  public $name;
  // nameプロパティを定義
}
>
$curry = new Menu();
$curry->name = 'CURRY';
// プロパティに値をセット
>
echo $curry->name;
// セットした値にアクセス
?>
```

結果
CURRY

#メソッド
メソッドはそれぞれのインスタンスが持つ関数のことである。
メソッドは『pablic function メソッド名()』のように定義する。また、『インスタンス->メソッド名()』のようにメソッドを呼び出すことができる。
>```php
<?php
class Menu {
  // メソッドを定義
  public function hello() {
  echo 'これはMenuインスタンスです';
  }
}
```
```php
$curry = new Menu();
$curry->hello();
?>
```

結果
これはMenuインスタンスです

#$this
メソッド内でインスタンスのプロパティやメソッドにアクセスしたい時には『＄this』という特殊な変数を用いる。
＄thisはクラス内のメソッドの定義の中でのみ使用できる。
＄thisはメソッドが呼ばれた時に、そのメソッドを呼び出しているインスタンスに置き換えられる。
>```php
<?php
class Menu  {
  public $name;
  public function hello() {
    echo 'これは'.$this->name.'です';
    // この場合$thisはメソッドを呼び出している$curryインスタンスに置き換えられる
  }
}
>
$curry = new Menu();
$curry->name = 'CURRY';
$curry->hello();
```

結果
これはCURRYです

#コンストラクタ
__constructメソッドを定義すると、newを用いてインスタンスを生成するときに、このメソッドが自動的に呼び出される。
このようなインスタンス生成時に呼び出されるメソッドをコンストラクタという。
>```php
class Menu {
  public function __construct() {
    // コンストラクタ内で行いたい処理
  }
}
```
```php
<?php
class Menu {
  public function __construct() {
    echo 'メニューが作成されました';
  }
}
>
// コンストラクタが呼び出される
$curry = new Menu();
```

結果
メニューが作成されました

#コンストラクタと引数
newを用いてインスタンスを生成する際に引数を与えることができ、その値を__constructメソッドに渡せる。
>```php
<?php
class Menu {
  public $name;
  public function __construct($name) {
    echo $name;           // 引数を受け取る
  }
}
$curry = new Menu('CURRY');
               // 引数を与える
```

結果
CURRY

#コンストラクタとプロパティ
__constructメソッド内で、$thisを用いてインスタンスのプロパティに値をセットすることができる。
>```php
class Menu {
  public $name;
  public function __construct($name) {
    $this->name = $name;
  }
}
>
$curry = new Menu('CURRY');
echo $curry->name;
```

結果
CURRY

#HTMLにPHPを埋め込む
HTMLのコードとPHPのコードを切り分けることができ、見やすくなる。
>```php
// PHPのコード
<?php
class Menu {
  public $name;
}
$curry = new Menu('CURRY');
?>
// HTMLのコード
<p><?php echo $curry->name ?></p>
```

#セミコロンを省略できる条件
PHPのコードは、１行で書き表す場合は、区切る必要がないため、セミコロンを省略できる。
>```php
<p><?php echo $curry->name ?></p>
```

#foreach文をHTMLに埋め込む
foreach文の 『{』 の代わりに 『:』、 『}』 の代わりに 『endforeach』 と記述し、その間に処理を書いていく。
>```php:通常のforeach文
<?php
$words = array('apple', 'banana', 'orange');
foreach ($words as $eord) {
  echo '<p>'.$word.'</p>';
}
?>
```
```php:endforeachを用いたforeach文
<?php
$words = array('apple', 'banana', 'orange');
?>
<?php foreach ($words as $word): ?>
  <p><?php echo $word ?></p>
<?php endforeach ?>
```

#endif endfor
if文、for文、while文やswitch文などもforeach文と同様に、それぞれ『endif』、『endfor』、『endwhile』、『endswitch』を使って書くことができる。
>```php:endifを用いたif文
<?php
$age = 24;
?>
<?php if($age >= 20): ?>
  <p><?php echo 'あなたは成人です' ?></p>
<?php endif ?>
```
```php:endforを用いたfor文
<?php for($i = 0; $i < 100; $i++): ?>
  <p><?php echo $i ?></p>
<?php endfor ?>
```

#require_once
『require_once』を用いると別のphpファイルを読み込むことができる。
require_onceで読み込んだファイルで定義されているクラスや変数を、require_onceを記述したファイル内で使うことができる。
>```php:menu.php
<?php
class Menu {
 //
}
?>
```
```php:data.php
<?php
require_once('menu.php');
// menu.phpを読み込み
>
$curry = new Menu('CURRY')
// data.phpで定義した変数を使える
?>
```
```php:index.php
<?php require_once('data.php') ?>
// data.phpを読み込み
<p>
  <?php echo $curry->name ?>
  // data.phpで定義した変数が使える
</p>
```

#画像を表示する
imageプロパティの値は<img>タグのsrc属性に指定するため、ダブルクォーテーションの中に埋め込む。
echoしないとphpの処理の結果が出力されず、HTMLに反映されないので注意する。
>```php
<img src="<?php echo $curry->image ?>" >
```

#publicとprivate
カプセル化とは、クラスのプロパティとメソッドへのアクセスを制限することをいう。
クラスの外部からアクセスできるようにするには『public』を、アクセスできないようにするには『private』を用いて定義する。
プロパティは基本的にアクセス権をprivateにする。
>```php:public
class Menu {
> // public
  public $name;
>
  public function __construct($name) {
    $this->name = $name;
  }
}
$curry = new Menu('CURRY');
echo $curry->name;
```

結果
CURRY

>```php:private
class Menu {
> // private
  private $name;
>
  public function __construct($name) {
    $this->name = $name;
  }
}
$curry = new Menu('CURRY');
echo $curry->name;
```

結果　
エラー

#ゲッター
プロパティのアクセス権をprivateにするとプロパティの値をクラスの外から取り出すことができなくなる。そこで、
プロパティの値を返すだけのメソッドを定義する。このような、プロパティの値を返すだけのメソッドをゲッターという。
ゲッターは『getプロパティ名』のように命名するのが一般的である。
>```php
class Menu {
  private $name;
  public function __construct($name) {
>
    $this->name = $name;
    // クラス内なのでアクセスできる
>
  }
>
  // ゲッターの定義
  public function getName() {
    return $this->name;
    // クラス内なのでアクセスできる
  }
}
>
$curry = new Menu('CURRY');
echo $curry->getName();
```

#セッター
プロパティのアクセス権をprivateにするとプロパティの値をクラスの外から変更できなくなる。そこで、
プロパティの値を変更するメソッドを定義する。このような、プロパティの値を変更するメソッドをセッターという。
セッターは『setプロパティー名』のように命名するのが一般的である。
>```php
class Menu {
  private $orderCount;
  // ・・・
>
  // セッターの定義
  public function setOrderCount($orderCount) {
    $this->orderCount = $orderCount;
  }
}
```
```php
$juice = new Menu('JUICE',・・・);
>
// セッターを用いて値をセット
$juice->setOrderCount(2);
>
echo $juice->getOrderCount();
// 結果 : 2
>
$juice->orderCount = 4;
// privateなので直接アクセスできない
```

#プロパティの初期値
プロパティを定義する際に初期値をセットすることができる。
>```php
class Menu {
  // 初期値をセット
  private $orderCount = 0;
>
>
  public function getOrderCount() {
    return $this->orderCount;
  }
}
```
```php
$curry = new Menu('CURRY');
echo $curry->getOrderCount();
```

結果
0