##はじめに
PHPを勉強し始めると、すぐに出てくるstaticというキーワードですが
自分が理解をするのに時間がかかってしまったので
アウトプットも兼ねてまとめていきます。
##staticとは
インスタンスを作らずにクラス変数もしくは、
クラスメソッドを宣言すればアクセスすることができます。
staticは、インスタンス(個別の実体)ではなく
クラス側にプロパティやメソッドを持たせることができます。
クラス側に持たせた変数は「クラス変数」
関数を「クラスメソッド」といいます。
###注意点
1.staticの変数はオブジェクトからのアロー演算子->でアクセス不可
2.sutaticではないメソッドをstaticをつけたものと同じ方法で呼び出すとエラーになる
詳しくは、PHPドキュメントのこちらをご確認ください。
###クラス変数やクラスメソッドの呼び出し方
クラス変数やクラスメソッドでは、アロー演算子->が使えないため
->の代わりにスコープ定義演算子(::)を
$thisの代わりにselfを使います。
Nekoクラスにクラス変数とクラスメソッドを使ってみます。
<?php
<?php
class Neko {
public static $type = "飼いネコ";
public $suffix = "";
public $hp = 20;
public $power = 10;
function __construct($suffix) {
$this->suffix = $suffix;
}
function name() {
return $this::$type . "の" . $this->suffix;
}
function attack($owner) {
print $this->name() . "が" . $owner . "を攻撃し" . $this->power . "ポイントのダメージを与えた!" . PHP_EOL;
}
//クラスメソッド
static function description() {
print self::$type . "は、凶暴だが最愛の家族だ。" . PHP_EOL;
}
}
Neko::description();
$neko_A = new Neko("モカ");
$neko_B = new Neko("カフェ");
$neko_A->attack("飼い主");
$neko_B->attack("他のネコ");
コンソール入力
$php tex.php
実行結果
飼いネコは、凶暴だが最愛の家族だ。
飼いネコのモカが飼い主を攻撃し10ポイントのダメージを与えた!
飼いネコのカフェが他のネコを攻撃し10ポイントのダメージ
クラスの説明をする関数
description()という名前のクラスメソッドを用意しました。
Neko::description();と書いて呼び起こしていますが
アロー関数->を使うとどうでしょう。
// Neko::description(); だったものを
Neko->description();
実行結果
PHP Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR)
となり、変なところに->があるねん!という内容になります。
なので、staticをつけた変数や関数はクラス名::○○と書く必要があるということですね。(変数を参照したい場合はスコープ定義演算子の後に$を入れてください)
###まとめ
スコープ定義演算子が出てきた時は、
アロー演算子を覚えたばかりだと戸惑ってしまいますが
staticを使った関数の場合はアロー演算子ではなく
スコープ定義演算子を使うと覚えれば良さそうです。
・クラス名::○○ static宣言されたメソッドやプロパティへアクセスする
・self::○○ 自クラスのクラス変数、クラスメソッドへアクセスする
・parent:: 指定した親クラスを示す
・インスタンス変数::○○ (self::○○) インスタンスが持つクラス変数やクラスメソッドへアクセスする