PHP – クラス

クラスの定義

  • classキーワードでクラスを定義
  • プロパティーはprivate/protected/publicで宣言
  • コンストラクターはpublic function __construct()で定義(アンダースコア2つ)
  • メソッドはpublic/protected/private functionで定義
  • インスタンスの生成はnew クラス名(...);

プロパティー

宣言・定義

プロパティー宣言時に値の初期値を定義可能。

private/protected/public プロパティー = 初期値;

参照・代入

クラス内でのプロパティー参照・代入

$this->プロパティー名($除き)

publicプロパティーのインスタンスからの参照・代入

インスタンス変数->プロパティー名($除き)

メソッド

メソッドはオーバーロードできない

PHPでは、異なるシグネチャーでメソッドをオーバーロードすることはできない。コンストラクターについても同じくオーバーロードできない。

以下のクラスではメソッドをシグネチャーの違いによってオーバーロードしようとしている。

しかし複数宣言はできないというエラーになる。

デフォルト引数は使える

異なるシグネチャーのメソッドは、デフォルト引数を使うことで実現できる。

デフォルト引数が指定されている場合に引数を指定すると、先頭の引数から値が設定されていく。引数名を指定して任意の引数の実を指定することはできない。

コンストラクター/デストラクター

public function __construct(...) { ... }
public function __destruct(... { ... }

  • いずれも動詞形で、先頭にアンダースコアを2つつける

クラスを継承した場合、コンストラクター/デストラクターを定義しなければ、親クラスのそれらが呼ばれるが、定義した場合には明示的に親クラスのコンストラクター/デストラクターを呼び出す必要がある。

parent::__construct(...)
parent::__destruct(...)

staticプロパティー

プロパティーをstatic宣言することで、クラスとして保持されるようになる。

private static宣言

クラス外からアクセス不能なクラスレベル変数。

  • クラス内で(すなわち各インスタンスから)self::プロパティー名($付き)でアクセスできる
  • 全インスタンスで1つの値を共有する

以下の例では全インスタンスに共通のカウンターをクラス変数として持ち、

public static宣言

クラス外からもアクセス可能なクラスレベル変数。

  • クラス内外を問わず、クラス名::プロパティー名($付き)でアクセスできる

以下のコードではクラスレベルのカウンターをpublic宣言し、クラス外からもアクセス可能としている。

8行目はself::$countでもよいが、クラス外からもアクセス可能なことを強調してMyClass::$countとしている。

staticメソッド

public static宣言

クラス外からもアクセス可能なクラスレベルメソッド。

以下のコードでは、private static宣言されたカウンターを、public static宣言されたメソッドで参照している。このようにすると、private宣言されたカウンターが外部で変更される恐れがなくなる。

private static宣言

private宣言したメソッドはstatic宣言されたクラスメソッドでもインスタンスメソッドでもあまり変わりはないように思える。

こちらの記事で、staticメソッドからインスタンスのプロパティーにアクセスできないことを利用して、メソッドが余計な副作用を持たないことを明示できるとあって、なるほどと思った。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です