[PHP] クラス

PHPのクラスの基本を復習メモです。
書きかけなので復習を繰り返すと増えていくかも。
基本的なコード
1<?php
2
3class Hero
4{
5 public $name = 'Hero';
6
7 public function showName()
8 {
9 echo $this->name, "\n";
10 }
11}
12
13$hero = new Hero();
14$hero->showName();
クラスの生成: newキーワード
クラスを生成する時はnewキーワードを使う。
先程のHeroクラスを生成するコードはこんな感じ。
Heroクラスを生成 コードを開く
1$hero = new Hero();
newで指定するクラス名は変数で指定することも可能。
クラス名を変数で指定 コードを開く
1<?php
2
3$c_name = 'Hero';
4$hero = new $c_name();
動的にクラスを生成したい時なんかに使えそう。
サンプル:動的にクラスのインスタンスを生成
変数にクラス名を入れて、その変数を使ってインスタンスを生成するサンプルを作ってみる。
サンプルコード コードを開く
1<?php
2// Heroクラスのインスタンスが生成される
3$c_name = 'Hero';
4$actor = new $c_name();
5$actor->showName();
6
7// Enemyクラスのインスタンスが生成される
8$c_name = 'Enemy';
9$actor = new $c_name();
10$actor->showName();
結果は以下の通りです。
1Hero
2Enemy
変数を使わずにオブジェクトのメンバにアクセスする
インスタンスを変数に入れないで、一度しか使わないような時に使っています。
例としては良くないですが、Heroクラスを使ってサンプルを作ってみます。
Heroインスタンスを生成してshowNameメソッドを呼んでいます。
変数に入れずにnewする コードを開く
1<?php
2
3(new Hero())->showName();
結果は以下の通りです。
1Hero
アクセス権
クラスのメンバへのアクセスの制御を指定する方法です。
種類を表にまとめてみました。
| アクセス権の種類 | アクセスの範囲 |
|---|---|
| private | 定義されたクラスのみ |
| protected | 定義されたクラス・そのサブクラス・親クラス |
| public | 制限なしでアクセス可能 |
プロパティとメソッドへの使い方はほぼ同じなのですが、以下の違いがあります。
| 項目 | 説明 |
|---|---|
| プロパティ | アクセス権の指定が必須 (varを使った場合はpublic) |
| メソッド | アクセス権の指定は必須ではない (指定しない場合はpublic) |
継承:extendsキーワード
継承の基本的なルールはこんな感じ。
- 単一継承のみ(多重継承は不可)
- プロパティ・メソッドを継承
- 継承時、プロパティ・メソッドはオーバーライド可能
(final指定を除く)
基本コード
基本コード コードを開く
1<?php
2
3// 親クラス
4class Actor
5{
6 protected $name;
7 protected $image_color = 'red';
8}
9// 子クラス
10class Hero extends Actor
11{
12 public function __construct($name)
13 {
14 $this->name = $name;
15 }
16
17 public function showName()
18 {
19 echo $this->name, "\n";
20 echo 'image color is ', $this->image_color, "\n";
21 }
22}
23
24$hero = new Hero("Hero");
25$hero->showName();
オーバーライド:プロパティ
基本:ベースクラスのプロパティをオーバーライド
まずはベースクラス(Actor)のプロパティ($name)をサブクラス(Hero)でオーバーライドするサンプルを作ってみます。
コード コードを開く
1<?php
2
3class Actor
4{
5 protected $name = 'Actor';
6}
7
8class Hero extends Actor
9{
10 protected $name = 'Hero';
11
12 public function showName()
13 {
14 echo $this->name, "\n";
15 }
16}
17
18$hero = new Hero();
19$hero->showName();
結果は以下のとおりです。
1Hero
サブクラス側で$nameをオーバーライドしているので、Heroと表示されました。
ちなみに、Heroの$name部分をコメントアウトすれば、オーバーライドされないので結果はこのようになります。
1// Heroクラスのコメントアウトする部分
2// protected $name = 'Hero';
結果は以下のとおりです。
1Actor
静的プロパティにアクセス
静的プロパティはオーバーライドしても、サブクラスからparentキーワードを使って親クラスのプロパティを参照することができる。
サンプルを作ってみます。
HeroのshowNameメソッドにbool値を受け取るようにして、その値により親か子の$nameを表示するようにしてみます。
サンプルコード コードを開く
1<?php
2
3class Actor
4{
5 static protected $name = 'Actor';
6}
7
8class Hero extends Actor
9{
10 static protected $name = 'Hero';
11
12 public function showName($isShowParent)
13 {
14 if ($isShowParent)
15 {
16 echo parent::$name, "\n";
17 }
18 else
19 {
20 echo self::$name, "\n";
21 }
22 }
23}
24
25$hero = new Hero(); // Heroインスタンスを生成
26$hero->showName(true); // 親クラスの$nameを表示
27$hero->showName(false); // 子クラスの$nameを表示
結果は以下のとおりです。
1Actor
2Hero
おわりに
今回はクラスの基本を復習してみました。
徐々に追記していきます。

