PHP オブジェクト・クラス・継承・インターフェース・名前空間

オブジェクト

object型は関数もまとめることが可能

オブジェクトを作成

// クラス
class クラス名 //頭文字は大文字
{
    // プロパティ
    public $変数1;
    public $変数2;

    // メソッド
    public function 関数名()
    {
        処理;
        //自分のクラスのプロパティを呼び出す
        $this->変数1;
        $this->変数2;
    }
}

値を代入

// インスタンス
$クラス名[0] = new クラス名();

// プロパティに代入
$クラス名[0]->変数1 = 値1;
$クラス名[0]->変数2 = 値2;
$クラス名[1]->変数1 = 値3;
$クラス名[1]->変数2 = 値4;

// 関数を実行
$クラス名[0]->関数名();
$クラス名[1]->関数名();

コンストラク

class クラス名
{
    public $変数1;
    public $変数2;

    // newでインスタンス生成時に実行される関数
    public function __construct($変数3, $変数4)
    {
        // 引数で受け取った値を変数に代入
        $this->変数1 = $変数3;
        $this->変数2 = $変数4;
        // 変数名は変数3を変数1に変数4を変数2と同じにすればより分かりやすい
    }

    public function 関数名()
    {
        処理;
    }
}
// インスタンスとプロパティへの代入をまとめる
$クラス名[0] = new クラス名(値1, 値2);
$クラス名[1] = new クラス名(値3, 値4);

アクセス修飾子

アクセス修飾子をつけなかった場合はpublicとなる

アクセス修飾子 説明
public クラスの内外で利用可能
private クラス内でのみ利用可能
protected クラス内と子クラスのみ利用可能

型宣言

// 型を強調させる
declare(strict_types=1);

class クラス名
{
    private string $変数1;
    public function __construct(string $変数2)
    {
        $this->変数1 = $変数2;
    }
    public function 関数名()
    {
        処理;
    }
}
$クラス名[0] = new クラス名(値1, 値2);

static (クラスにプロパティを設定)

class クラス名
{
    // クラスプロパティ
    アクセス修飾子 static $変数 = 値;

    public function __construct(引数)
    {
        // staticをつけたプロパティにアクセスして+1する処理
        self::$変数++;
    }
    // クラスメソッド
    public static function 関数名()
    {
        printf(self::$変数);
    }
}
// クラスメソッドを呼び出す
クラス名::関数名();

const ( 定数 )

class クラス名
{
    // 定数名には「 $ 」記号を付けない!また、全て大文字にするのが慣習
    アクセス修飾子 const 定数名 = 値;

    public static function 関数名()
    {
        print(self::定数名);
    }
}
// 定数のアクセス修飾子がpublicだった場合にクラス外から呼び出す
echo クラス名::定数名;

extends ( クラスを継承 )

// 新クラスが元クラスを継承
class 子クラス名 extends 親クラス名{ }
  • 継承元 = 親クラス/Superクラス
  • 継承したクラス = 子クラス/Subクラス
  • PHPでは親クラスは必ず1つ
  • クラスを継承すると型も継承されるため、継承したクラス全てのコードを変更せずにまとめて変更可能になる
function 関数名(親クラス名 $変数名)
{
    処理;
}

foreach ($変数1 as $変数2) {
    関数名($変数2);
}

parent ( 親クラスのコンストラクタを使う )

public function __construct(引数)
{
    parent::__construct(引数);
}

override

親クラスと同じ名前のメソッド名を使うこと

  • overrideさせたくないメソッドは親クラスでメソッドの頭にfinalをつける
final アクセス修飾子 function 関数名()
{
    処理;
}

abstract ( 抽象クラス )

  • 特定のメソッドを子クラスで必ず定義させるのに使う
  • 抽象クラスはインスタンスを作ることはできない
abstract class 抽象クラス名
{
    // 抽象メソッド
    // 定義は子クラスで記述するため中身は空のまま
    abstract public function メソッド名();
}

// 親クラスで抽象クラスを継承する(よって、親クラスは抽象クラスとなる)
class 親クラス名 extends 抽象クラス名{}

インターフェース

  • 抽象メソッドだけを持つことができる
  • インターフェースの実装をすることで、強制するクラスを自由に決めれる
  • いくつでも実装可能
  • 継承関係とは無関係

implements ( 実装 )

実装したクラスはインターフェースの型も引き継がれる(継承と同じ)

interface インターフェース名
{
    public function メソッド名();
}

class 子クラス名 extends 親クラス名 implements インターフェース名

トレイト ( 共通のコードをまとめる )

// トレイトで共通のコードをまとめる
trait トレイト名
{
    共通のコード;
}

class クラス名 extends 親クラス名 implements インスタンス名
{
    use トレイト名;
}

外部ファイルを読み込む

require('外部ファイル.php'); // ファイルを読み込めなかったとき処理が止まる
include('外部ファイル.php'); // ファイルを読み込めなくても処理が止まらない

// 既にファイルが読み込まれている場合はスキップ
require_once('外部ファイル.php');
include_once('外部ファイル.php');

sql_autoload_register() ( オートロード )

newでインスタンス生成時にクラスが読み込まれていなかった場合、呼ばれる関数

// 読み込まれていなかったクラスを引数で受け取る
sql_autoload_register(function ($変数名) {
    // 引数で受け取ったクラスを読み込む
    require($変数名 . '.php');
});

名前空間 ( 名前の衝突を避ける )

namespaceはベンダー名とプロジェクト名がよく使われる

namespace ベンダー名\プロジェクト名;

$変数名[0] = new ベンダー名\プロジェクト名\クラス名(値);

名前空間を短い別名にする

use ベンダー名\プロジェクト名 as 別名;

// 別名をプロジェクト名にする場合
use ベンダー名\プロジェクト名;