インスタンス
- インスタンス生成はnew
- メンバ = フィールド+メソッド
- インスタンスは独立
メソッドは参照渡し- メソッドには参照渡し、値渡しがある[詳細]
※mpywさんありがとうございます!
ざっくりまとめ
引数の型 | 渡し方 | メソッド内:値変更可否 | メソッド内:参照変更可否 |
---|---|---|---|
変数 | 値渡し | x | x |
変数 | 参照渡し(&) | x | x |
array | 値渡し | x | x |
array | 参照渡し(&) | x | o |
Object | 値渡し | o | o |
Object | 参照渡し(&) | o | x |
class Product
{
// フィールド
private $hoge
// メソッド
public function bizz()
{
return $this->hoge;
}
}
$product = new Product();
$product->bizz();
コンストラクタ
- インスタンス生成時に実行
- 基本はpublic
class Product
{
public function __construct()
{
}
}
カプセル化
- privateで宣言
- 外部との結びつきを弱めるリファクタリングを容易化
- 外部からの改悪に対して必要最低限の公開が目的
継承
- クラスのフィールドとメソッドを引き継ぐ
- privateは引き継がれない
- protectedは継承先のクラスでのみ参照可能
- 継承はextends
- 類似クラスはコピペではなく、保守を考えて継承
class ParentProduct
{
protected $hoge
private function $bizz()
{
}
}
class Product extends ParentProduct
{
private function $bizzbizz()
{
}
}
オーバーライド
- 親クラスと同一名でメソッドの上書き
- 親クラスのメソッド呼び出しにはparent::メソッド名
静的メンバ
- スタティック(静的)メンバ
- 「public static メソッド/フィールド」で宣言
- 呼び出しは「クラス名::メソッド/$フィールド」
- インスタンス化不可
- シングルトンはコンストラクタをprivateとして自己呼び出し
- 自己呼び出しには「self()/self::$フィールド名」
定数
- 定数「define(定数名、値)」
- クラス定数「const 定数名=値」
- 他クラスよりクラス定数参照「クラス名::定数名」
- クラス内参照「self::定数名」
抽象クラス
- 継承しないと使用不可
- 抽象メソッドは必ずオーバーラードする
- 生成はabstract(クラス/メソッド)
- 継承はextends
- 多重実装不可
インターフェース
- 定義は抽象メソッドのみ = 全てオーバーライド
- 抽象クラスの定義にabstractは不要だが必ずpublic
- 生成は**interface(クラスのみ)
- 継承は**implements
- 多重実装可
ポリモーフィズム
- 同一名のメソッドによる処理
- 型の曖昧さをなくすのがタイプヒンティング
- 条件分岐をクラス名で変えてしまう
- インターフェースの多重実装と同等の意
// タイプヒンティング例
// Bizzクラスしか処理しない
public function hoge(Bizz $bizzbizz)
{
$product->bizz()
$this->products[] = $product;
}
例外処理
- PHPは自動で例外を投げない
- throw new Exception()で投げる
try{
throw new Exception();
} catch(Exception $e) {
}