[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クラスを生成 コードを開く
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する コードを開く
変数に入れずにnewする
1<?php
2
3(new Hero())->showName();

結果は以下の通りです。

1Hero
なプ

PHP 5.4.0以降で使えることに注意する。

アクセス権

クラスのメンバへのアクセスの制御を指定する方法です。
種類を表にまとめてみました。

アクセス権の種類 アクセスの範囲
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
なプ

通常のプロパティでないことに注意!

おわりに

今回はクラスの基本を復習してみました。
徐々に追記していきます。

参考

PHP: クラスの基礎 - Manual

\ ちょっとお買い物 /


関連した記事