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 ベンダー名\プロジェクト名;