PHP7.4.1における性的プロパティと静的メソッドについて。
//クラス
class Ca {
//プロパティ
protected float $ia; //通常の実数型のプロパティ
public static float $ib = 0.1; //静的な実数型のプロパティ
//コンストラクター(メソッド)
public function __construct($a) {
$this->ia = 1 + ($a / 100); //引数を%に変換して1を加算して$iaに代入
}
//ゲッター(メソッド)
public function getIa($b): int {
return $b * $this->ia; //引数の税込み価格を演算
}
//ゲッター(静的メソッド)
public static function getIb($c): int { //staticを付けると静的なメソッドになる
return $c * (1 + self::$ib); //self::$ibとすることで$ibにアクセスできる
}
}
//実行
$ca = new Ca(10);
echo "お会計は", $ca->getIa(1280), "円です\n"; //お会計は1408円です
//静的プロパティの呼び出し
echo Ca::$ib, "\n"; //0.1 ← 問題なくアクセスできる
echo "$ibの値は", Ca::$ib, "です。\n"; //Noticeだが一応0.1は表示される
echo "$ibの値は{Ca::$ib}です。\n"; //Noticeのうえに値も表示されない
//静的メソッドの呼び出し
echo 'お会計は', Ca::getIb(1280), "円です\n"; //お会計は1408円です
静的プロパティとは、データ型の前にstaticを記述したプロパティのことです。
静的プロパティはスタティックプロパティとも呼ばれます。
静的プロパティはアクセス修飾子がpublicであるならば、クラス外からでもインスタンスを経由せずにスコープ定義演算子(::)を使って呼び出すことができます。
静的メソッドは、functionの前にstaticと記述したメソッドのことです。
静的メソッドはスタティックメソッドとも呼ばれます。
静的メソッドはアクセス修飾子がpublicであるならば、クラス外からでもインスタンスを経由せずにスコープ定義演算子を使って呼び出すことができます。
以下、静的プロパティおよび静的メソッドへのアクセスの定形です。
①静的プロパティへのクラス内からのアクセス方法
self::プロパティ名;
②静的プロパティへのクラス外からのアクセス方法
クラス名::プロパティ名;
③静的メソッドへのクラス外からのアクセス方法
クラス名::メソッド名();
上記のように、静的オブジェクトへのアクセスにはスコープ定義演算子(::)を使います。
クラス外からのアクセスには クラス名::〇〇; の形式をとります。
静的プロパティに関しては、クラス内からアクセスするには self::プロパティ名; の形式をとる必要があります。
なおstaticを宣言してしまったプロパティやメソッドには、疑似変数である$thisを使うことはできません。
静的オブジェクトに$thisでアクセスしようとするとすべてErrorとなってしまいます。
またなぜかは分かりませんが、上記スクリプトのように静的プロパティをクラス外からecho関数を使って呼び出すときに クラス名::プロパティ名; の記述の前に文字列を連結するとNoticeの警告が出ます。
また通常の変数であればアクセス可能な方法であるecho関数のダブルクオーテーションで囲った文字列内にブレイス(波括弧)で変数を記述する方法では、静的プロパティにアクセスすることすらできません。
なぜかは分かりませんが、まあなんかそういう仕様らしいです。
以上です。