【オブジェクト指向3】クラス変数とクラスメソッド(static)

メンバ  :class内の変数やメソッド
動的メンバ:生成したインスタンスからアクセスできる
静的メンバ:インスタンスを生成しなくてもクラスのメンバにアクセスできる

記述方法

・変数やメソッドの前にstaticを記述する

<?php
    class Product{
      public $itemName;
      public $itemPrice;
      public static $itemCount = 0;
   }
}
?>

echo Product::getitemCount();
?>
|

インスタンスからではなく、クラスそのものから呼び出す

<?php
echo Product::$itemCount;
?>

結果
0

なぜstaticが必要なのか

クラスはインスタンスの集合体という概念をもつ
すると現状、例えば、「インスタンスの合計金額」を知りたい場合などいくらclassにメソッドを記述してもある特定のインスタンスを起点にして呼び出すことことしかできない。
staticにすると中立的な立場ですべてのインスタンスの情報を統合した見た目で記述できる。

NGパターン

<?php
class Product{
    private $itemName;
    private $itemPrice;
    public static $itemSumPrice = 0;
    
    public function __construct($itemName,$itemPrice){
      $this->itemName = $itemName;
      $this->itemPrice = $itemPrice;
    }
    
    //インスタンスの合計金額 【動的】メソッド = 生成したインスタンスからしか実行できない
    public function itemSumPrice($item1,$item2){
      return $item1->itemPrice + $item2->itemPrice;
    }
    
    public function getitemName(){
      return $this->itemName;
    }
     public function getitemPrice(){
      return $this->itemPrice;
    }   
}

//インスタンス生成
$itemA = new Product("シャツ",1500);
$itemB = new Product("デニム",3400);

//インスタンスの合計金額メソッドを、$itemAを起点に呼び出している
echo $itemA->itemSumPrice($itemA,$itemB);

?>


結果
4900


現状、動的メンバのため、生成したインスタンスからしか呼び出せない。
そのため、$itemAを起点に呼び出している、が、これ別に$itemBからでも$itemCからでも呼び出せる。。
ポイント:インスタンスの”合計”〇〇は、インスタンス全体の問題で俯瞰で処理すべきこと。

OKパターン

<?php


?>

オーバーライドできない

以下ページの一番下のstaticをオーバーライドしても変わらない件が謎。

https://www.sejuku.net/blog/23753#i

そもそもオーバーライドしているのはfooだからreturnの中身が更新されないという話ではないのか?
子クラスもbarが使えるのはわかるが、その時だけご丁寧に親クラスのreturnを返すのかわからない。。

===========
参照記事(ありがとうございました!!)
https://qiita.com/mpyw/items/41230bec5c02142ae691qiita.com

===========