[PHP] クラス



PHPのクラスの基本を復習メモです。
書きかけなので復習を繰り返すと増えていくかも。

基本的なコード

<?php

class Hero
{
    public $name = 'Hero';

    public function showName()
    {
        echo $this->name, "\n";
    }
}

$hero = new Hero();
$hero->showName();

クラスの生成: newキーワード

クラスを生成する時はnewキーワードを使う。
先程のHeroクラスを生成するコードはこんな感じ。

Heroクラスを生成 コードを開く
Heroクラスを生成

$hero = new Hero();

newで指定するクラス名は変数で指定することも可能。

クラス名を変数で指定 コードを開く
クラス名を変数で指定

<?php

$c_name = 'Hero';
$hero = new $c_name();

動的にクラスを生成したい時なんかに使えそう。

サンプル:動的にクラスのインスタンスを生成

変数にクラス名を入れて、その変数を使ってインスタンスを生成するサンプルを作ってみる。

サンプルコード コードを開く
サンプルコード

<?php
// Heroクラスのインスタンスが生成される
$c_name = 'Hero';
$actor = new $c_name();
$actor->showName();

// Enemyクラスのインスタンスが生成される
$c_name = 'Enemy';
$actor = new $c_name();
$actor->showName();

結果は以下の通りです。

Hero
Enemy

変数を使わずにオブジェクトのメンバにアクセスする

インスタンスを変数に入れないで、一度しか使わないような時に使っています。

例としては良くないですが、Heroクラスを使ってサンプルを作ってみます。
Heroインスタンスを生成してshowNameメソッドを呼んでいます。

変数に入れずにnewする コードを開く
変数に入れずにnewする

<?php

(new Hero())->showName();

結果は以下の通りです。

Hero
なプ

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

アクセス権

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

アクセス権の種類 アクセスの範囲
private 定義されたクラスのみ
protected 定義されたクラス・そのサブクラス・親クラス
public 制限なしでアクセス可能

プロパティとメソッドへの使い方はほぼ同じなのですが、以下の違いがあります。

項目 説明
プロパティ アクセス権の指定が必須 (varを使った場合はpublic)
メソッド アクセス権の指定は必須ではない (指定しない場合はpublic)

継承:extendsキーワード

継承の基本的なルールはこんな感じ。

  • 単一継承のみ(多重継承は不可)
  • プロパティ・メソッドを継承
  • 継承時、プロパティ・メソッドはオーバーライド可能
    (final指定を除く)

基本コード

基本コード コードを開く
基本コード

<?php

// 親クラス
class Actor
{
    protected $name;
    protected $image_color = 'red';
}
// 子クラス
class Hero extends Actor
{
    public function __construct($name)
    {
        $this->name = $name;
    }

    public function showName()
    {
        echo $this->name, "\n";
        echo 'image color is ', $this->image_color,  "\n";
    }
}

$hero = new Hero("Hero");
$hero->showName();

オーバーライド:プロパティ

基本:ベースクラスのプロパティをオーバーライド

まずはベースクラス(Actor)のプロパティ($name)をサブクラス(Hero)でオーバーライドするサンプルを作ってみます。

コード コードを開く
コード

<?php

class Actor
{
    protected $name = 'Actor';
}

class Hero extends Actor
{
    protected $name = 'Hero';

    public function showName()
    {
        echo $this->name, "\n";
    }
}

$hero = new Hero();
$hero->showName();

結果は以下のとおりです。

Hero

サブクラス側で$nameをオーバーライドしているので、Heroと表示されました。

ちなみに、Heroの$name部分をコメントアウトすれば、オーバーライドされないので結果はこのようになります。

// Heroクラスのコメントアウトする部分
// protected $name = 'Hero';

結果は以下のとおりです。

Actor

静的プロパティにアクセス

静的プロパティはオーバーライドしても、サブクラスからparentキーワードを使って親クラスのプロパティを参照することができる。

サンプルを作ってみます。

HeroのshowNameメソッドにbool値を受け取るようにして、その値により親か子の$nameを表示するようにしてみます。

サンプルコード コードを開く
サンプルコード

<?php

class Actor
{
    static protected $name = 'Actor';
}

class Hero extends Actor
{
    static protected $name = 'Hero';

    public function showName($isShowParent)
    {
        if ($isShowParent)
        {
            echo parent::$name, "\n";
        }
        else
        {
            echo self::$name, "\n";
        }
    }
}

$hero = new Hero();      // Heroインスタンスを生成
$hero->showName(true);   // 親クラスの$nameを表示
$hero->showName(false);  // 子クラスの$nameを表示

結果は以下のとおりです。

Actor
Hero
なプ

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

おわりに

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

参考

PHP: クラスの基礎 - Manual



関連した記事