PHP オブジェクト指向クラスの基本


プログラムを組む上でオブジェクト指向で組むことが求められていますので、 解説しながら書いてみます。
ざっくり書くと変数を持てる関数の集合体です。
なぜこの書き方が必要かというと、変数は値を保持できますが、処理はできません。
関数は処理ができますが値を保持できません。同じ処理が行うためにこの処理が必要になります。
分かりやすく図で書くとこんな感じになります。
基本のクラス
class クラス名 {
}
書き方ですが、クラスの定義にはまずはclassの後に好きなクラス名を記述します。
そして始まりと終わりには{}中括弧brace で閉じまます。
次に変数を中に設定します。
ルールとして、クラス名はアッパーキャメルという方式で単語毎に大文字で名前をつけます。
例えば、Module Controllerなら、
class Module_Controller {
}
とういうように記述します。
シンプルにインスタンスを作ってみます。
class Staff {

    public function work() {
        echo '仕事しています',PHP_EOL;
    }

}
$kato = new Staff();
$kato->work();
仕事しています
このPHP_EOLは改行で、->というのはアロー演算子で指定します。
また、$sato = $kato とすれば、同じ値を持つ事ができます。
つまり同じオブジェクトを示すことになります。
$sato = $kato ;
$sato->work();
仕事しています
同じオブジェクトを参照もいいですが、複製したい場合もあります。
その場合は、$sato = clone $kato ; とします。
複製した後に$satoに何か代入しても$katoには影響がされません。

次に内部の関数で指定していたpublicという部分、
アクセス修飾子を見てみます。
サンプルとして商品をクラスで登録してみます。
class Product {
      private $name; // 商品名
      private $price; // 価格
}
商品には名前と価格がありますので、最初に変数を宣言してみます。
この変数はフィールド・メンバ変数とも呼びます。
最初にprivateという修飾子を書いていますが、これはスコープになります。

次に処理を書きます。これは関数でメソッドと言います。
                class Product { 
                    private $name; // 商品名 
                    private $price; // 価格 
                    
                    // 商品名を取得する
                    public function getName()
                    {
                    return $this->name; 
                    } 
                    // 商品名を設定する 
                    public function setName($name)
                    { 
                    $this->name = $name; 
                    } 
                } 
                
メソッドはユーザー関数と同じ様に書きますが、ここではpublicという文字が付いています。
これは修飾子でフィールド(メンバ変数)のprivateと同じで外部から見れるかどうかです。
publicは外部からアクセスが可能なという意味です。
またメンバ変数でvar を使ってアクセス権を明示せずに宣言した場合、
そのプロパティは public として定義されます。 参照>アクセス権
メソッド(関数)の中に$thisというのはクラス自信のメンバ(フィールド)を指します。
そしてその後の->はアロー演算子といい、クラスのメンバにアクセスする場合に使います。
$this->name で [ Productクラス自身の$nameの値 ] という意味になります。
注意点は->の後は$が省略されるという点です。

クラスの基本構造はこれだけです。
値を持つフィールドと処理するメソッドです。
そしてそれぞれ外部からアクセス可能にするかを設定するという事になります。

次に実際に使ってみます。 クラスだけは何も意味も持ちません。
これを元に実態を作ります。
オブジェクトの設計図はクラス
オフジェクトの実体はインスタンスになります。

              $product = new Product(); 
              

予め クラスが作られていれば、
new クラス名() でクラスのインスタンスが作られます。
上記では$product が実体になります。

                      
                      // クラスを定義
                      class Product {
                      private $name; // 商品名
                      private $price; // 価格
                      // 商品名を取得する
                         public function getName()
                        {
                         return $this->name;
                        }
                      // 商品名を設定する
                         public function setName($name)
                        {
                         $this->name = $name;
                        }
                      }
                      //インスタンスを作る
                      $product= new Product();
                      // 商品名を設定
                      $product->setName("スパナ");
                      // 商品名を取得
                      $productName = $product->getName();
                      var_dump($productName);
                      

実行結果
object(Product)#3 (2) { ["name":"Product":private]=> string(9) "スパナ" ["price":"Product":private]=> NULL }

説明するとインスタンス(実体)を作ると、それぞフィールドが用意されます。
そして値を投げてreturnで戻るという形です。

つまりクラスが設計図なので、インスタンスは複数作れることになります。
試してみます。
上記のインスタンスを作る部分を増やしてみます。

                  $product01 = new Product(); 
                  $product02 = new Product(); 
                  $product01->setName("のこぎり");
                  $product02->setName("ハンマー"); 
                  var_dump($product01); 
                  var_dump($product02); 
                  

object(Product)#4 (2) { ["name":"Product":private]=> string(12) "のこぎり" ["price":"Product":private]=> NULL }
object(Product)#5 (2) { ["name":"Product":private]=> string(12) "ハンマー" ["price":"Product":private]=> NULL }
ここで分かるように、それぞれインスタンスは別々に値を持てるということです。
それぞれオフジェクトとして利用ができます。
上記の場合に$product01の名前を出す場合は、
echo $product01->getName();として出します。