とぎぷろべい

包丁研ぎとプログラミングと米国株投資についてのなんやかんや

静的プロパティと静的メソッドについて(PHP)

f:id:feci:20210727001932j:plain

PHP7

 

PHP7.4.1における性的プロパティと静的メソッドについて

<?php

//クラス
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関数のダブルクオーテーションで囲った文字列内にブレイス(波括弧)で変数を記述する方法では、静的プロパティにアクセスすることすらできません。

 

なぜかは分かりませんが、まあなんかそういう仕様らしいです。

 

 

以上です。