カテゴリー
PHP

PHP7(7)クラスとオブジェクト

オブジェクト指向な部分(クラスのきほん)についてです。


クラスの作り方

PHPってクラスを使った記述もできるんですね!

うん、こんな風に書くの

// クラスの作成
class クラス名 {

  // プロパティ
  public $変数名 = デフォルト値;       ・・・変数
  private $変数名;             ・・・変数
  protected $変数名;           ・・・変数
  const 定数名 = 値;                ・・・定数
  static $静的変数名;            ・・・静的変数

  // メソッド
  public function メソッド名(引数) {
    echo $this->$変数名;           ・・・クラス内参照
    echo self::定数名;         ・・・クラス内参照
         ・・・
    return ・・・;
  }

  // 静的メソッド
  static function 静的メソッド名(引数) {
    ・・・
  }
}

// クラスの作成(継承)
class クラス名 extends 親クラス名 {
  ・・・
}

// インスタンスの生成
$obj = new クラス名();

// プロパティの参照
echo $obj->変数名;
// メソッドの参照
$obj->メソッド名(引数);
// 定数の参照
echo クラス名::定数名;
// 静的変数の参照
echo クラス名::$静的変数名;
// 静的メソッドの参照
echo クラス名::静的メソッド名();

クラスのきほん

クラスを使うときのルールは?

まず基本的なところ

  • クラス名は大文字と小文字を区別しない
  • アクセス権のきほん  visibility 
    • 通常 public をつけておく・・・どこからでもアクセスできる
      • private・・・継承関係のあるクラスからのみアクセスできる
      • protected・・・定義したクラス内でだけ使う
    • protected は書き換え(再定義)できない
      • public , private は書き換え(再定義)できる
    • static はインスタンス化せずにアクセスできる(インスタンス化したオブジェクトのstaticプロパティにはアクセスできない。メソッドは大丈夫[アクセスできる])
    • const(定数) や static(静的) のデフォルトのスコープは public です  static 
  • クラスやインスタンスを表すキーワード
    • $this-> ・・・クラス内で、自分自身のインスタンスを表す
    • self:: ・・・クラス内で、自分自身(クラス)を表す
    • parent:: ・・・親クラスを表す
    • static::・・・呼び出し元のクラスを表す
  • アロー演算子(->)・・・インスタンスのプロパティやメソッドにアクセスする
    • $obj->プロパティ名
    • $obj->メソッド名()
  • スコープ演算子(::)・・・クラス内の定数(const),静的(static)なプロパティやメソッドにアクセスする
    • クラス名::$静的プロパティ名
    • クラス名::静的メソッド名()
    • クラス名::定数プロパティ名
  • finalの意味  final 
    • finalメソッド・・・上書き禁止(メソッドの書き換えができない)
    • finalクラス・・・継承禁止(子クラスを作れない)
    • プロパティはfinal宣言できない。

クラスのきほん(その2)

インスタンスの型は object なの

  • インスタンスはobject型
    • object は参照型であり、object型の変数にはオブジェクトのIDが入っていてそれを元に実際のオブジェクトを参照する  references 
    • object型の変数を単に代入($sub = $obj;)しても同じものを参照してしまう。関数のobject型の引数についても同じ(オブジェクトのIDが値渡しされるので結局同じオブジェクトが参照される)。
    • object をコピーしたいときは $sub = clone $obj; とする。  cloning 
  • $obj1==$obj2・・・同じクラスから作られていれば真
  • $obj1===$obj2・・・まったく同じインスタンスを指しているときだけ真
  • foreach ($obj as $key => $value) { ・・・ } とすると、アクセス可能なプロパティの変数名とその値が $key$value に次々と代入されてループされる  iterations 

クラスのきほん(その3)

コンストラクタなどなど

  • コンストラクタ・・・function __construct() { ・・・ }
    • 初期化についてはプロパティのデフォルト値の設定でもある程度できる。けれども、あれこれ操作しようとするときはコンストラクタ。
  • クラスの抽象化・・・ abstract 
  • インターフェイス・・・ interfaces 
  • コードの再利用(トレイト)・・・ traits 
  • オブジェクトはシリアライズ(保存可能なバイト文字列に変換)できる  serialization 
    • クラス名とすべての変数が保存されるがメソッドは保存されない
    • 復元して利用するにはクラスの定義を復元先にも記述しておく

無名クラスの作り方

名前のないクラスなんてあるんですね

うん、PHP7から使えるようになったの

// いきなり無名クラスのメソッドを実行
( new class {
    public function メソッド名() { ・・・ }
  }
)->メソッド名();

// 変数に無名クラスのインスタンスを入れてから利用
$obj = new class {
  public function メソッド名() { ・・・ }
};
$obj->メソッド名();
// インターフェイスとトレイトと関数を用意(準備)
interface インターフェイス名 {
  public function インターフェイスメソッド名(引数);
}
trait トレイト名 {
  public function インターフェイスメソッド名(引数) {
    ・・・(具体的な実装)・・・
  }
}
function 無名クラスが引数の関数(インターフェイス名 $obj) {
  $obj->インターフェイスメソッド名(引数);
}

// 無名クラスを使って関数を実行
無名クラスが引数の関数(
  new class implements インターフェイス名 { use トレイト名; }
);

// 変数に無名クラスのインスタンスを入れてから実行
$obj = new class implements インターフェイス名 { use トレイト名; };
無名クラスが引数の関数($obj);