17.PHPのオブジェクト指向プログラミング
 1)オブジェクト指向プログラミングとは(超簡単にいうと)
   ソフトウェアの開発の対象を具体的な物「モノ」になぞらえて考えます。
   プログラムの世界では、この「モノ」をオブジェクトと呼んでいます。
   目の前のゲーム機や携帯電話などの具体的な「モノ」がオブジェクトです。
  また、旅行の計画や予定などの概念的な手に触れることができない「モノ」もオブジェクトです。
   このオブジェクト「モノ」の機能、役割などをプログラミングしてシステムを作り上げることを
  オブジェクト指向プログラミングと言います。

 2)オブジェクト指向プログラミングの必要性
   サーバアプリケーションは、ページ中心にコードを記述するため一つのファイルにたくさんの
  処理を記述しがちです。
   さらにページ数が増え大規模化します。しかし、その中には同じようなプログラムが多数存在するかもしれません。
  また、関数も多くなり、利用が大変になってきます。
   オブジェクト指向では、システムをオブジェクトに分割してシステム全体を構造化できます。
   オブジェクトは、「処理(メソッド)」と「データ(メンバー:プロパティ)」がセットになっておりカプセル化により保守性の高い
  コードを記述することができます。
   オブジェクト内部にプログラムやデータを持つことで、自律した動作ができオブジェクト間でメッセージの
  やり取りすることができます。

 3) オブジェクトとインスタンス
  ①クラスと抽象化
    クラスとは、オブジェクトを生成するための設計図のようなものです。たとえば、自転車には、設計図がありその設計図を
   元に実体(自転車)を作っていきます。このとき出来上がった自転車がオブジェクトです。
    このクラスをあるルールで分類し一つの設計図を構成することを抽象化といいます。

  ②インスタンス
    インスタンスとは、クラスを実体化しオブジェクト化したものをいいます。
    インスタンスとオブジェクトは同じような意味で使用させますが、クラスから生成されたオブジェクトを特にインスタンス
   と呼び、「役割」をもったオブジェクトを言います。一方オブジェクトは、「モノ」そのものをさし、「役割」などは見ていません。

  ③オブジェクトとクラスの階層
    自転車は、1つのオブジェクト、1つのクラスで構成されているのではなく、複数で構成されています。たとえば、自転車は、
   車輪、ハンドル、ブレーキなどで構成されており、それぞれが、オブジェクトでありクラスから生成されています。
    また、それぞれのオブジェクトとクラスは、下図のように階層的に存在します。
    php017-3-3

  ④クラスの構造
    クラス内部の「処理」のことを「メソッド」といい、そのオブジェクトの機能をつかさどるプログラムを記述します。
   また、「データ」のことを「メンバー」といい、 オブジェクトがメソッドを実行する上で必要なデータを格納します。

 4)オブジェクト(インスタンス)生成する方法
  ①クラスを定義する方法
    PHPでクラスを定義する場合は、[class]キーワードを使って定義します。
    <書式>
      <?php
      class クラス名
      {
        アクセス制限子 メンバー変数名=値;   //メンバー
        アクセス制限子 メンバー変数名;
                 |
                 |
        アクセス制限子 function 関数名([引数]) //メソッド
        {

          //処理の記述
          return 戻り値;  //戻り値を必要としない場合は、書かない。

        }
      }
      ?>

    アクセス制限子とは、メンバー変数やメソッドにアクセスするときの制限を与えるためのキーワードです。
    アクセス制限子には、以下のものがあります。     
 
アクセス演算子 意 味
public クラス外部からアクセスできる。
private メンバー変数を宣言したクラス内のみ参照できる。
protected メンバー変数を宣言したクラスと継承されたクラスから参照できる。
    

アクセス制御子を省略すると自動的に「public」になります。

  ②インスタンスを生成する方法
    インスタンスは、クラスから生成されます。これを実体化といいます。
    実体化は、クラスをコピーして実体化されるため複数のインスタンスを生成することができます。
    <書式>
      オブジェクト変数=new クラス名([コンストラクタの引数]);

 5)インスタンスを生成してみる。
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>インスタンスの生成</title>
    </head>
    <body>
    <?php
     class users{            //クラスの定義
      public $name;          //メンバー変数の宣言
      public $mail;
      public function print_data(){  //メソッドの定義
       print $this->name."さんのメールアドレスは、".$this->mail."です。<br>";
      }
     }

     $user=new users();
     $user->name="山田 太郎";
     $user->mail="abc@abc.com";
     $user->print_data();
    ?>
    </body>
    </html>

    ここで、$user->nameの「->演算子」は、クラス内のメンバー変数やメソッドにアクセスするためのキーワードです。
    記述は、以下のようになります。
     オブジェクト変数->メンバー変数=値    //メンバー変数への値の代入
     変数=オブジェクト変数->メンバー変数   //メンバー変数の値を変数に代入
     オブジェクト変数->メソッド           //メソッドの実行
     変数=オブジェクト変数->メソッド      //メソッドを実行してその戻り値を変数に代入

    また、「$this」 キーワードは、クラス内でメンバー変数やメソッドにアクセスするための特別なオブジェクト変数です。
    自分自身のメンバー変数やメソッドにアクセスするため「this」とされています。

 6)コンストラクターを使ったクラスの生成
   コンストラクターは、オブジェクトの初期化処理を行う時に使用されます。
   クラスのメンバーにコンストラクター関数(__construct())を宣言すると、オブジェクト生成時(new)に自動的に
  このメソッドが実行されるので、オブジェクトの初期化プログラムをコンストラクター関数内に書きます。
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>PHPのコンストラクタ</title>
    </head>
    <?php
     class users
     {
       public $name;
       public $mail;

       public function __construct($name,$mail) //コンストラクター
       {
         $this->name=$name;
         $this->mail=$mail;
       }

       public function print_data()
       {
         print $this->name."さんのメールアドレスは、".$this->mail."です。<br>";
       }
     }

     $user=new users("山田 太郎","abc@abc.com");
     $user->print_data();
   ?>
    <body>
    </body>
    </html>

 7)クラスから新しいクラスを生成する方法
   インヘリタンス(継承)とは、既存のクラスから新しいクラスを生成することで、既存クラスのメンバー変数やメソッドを継承
  します。この継承されるクラスをスーパークラスといい、継承するクラスをサブクラスといいます。
   <サブクラス生成の書式>
     <?php
       class サブクラス名 extends スーパークラス名
       {
         //処理の記述
       }
     ?>

 7)サブクラスを生成してみる。
   <html>
    <head>
    <title>スーパークラスとサブクラス</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
   スーパークラスとサブクラス<br>
    <?php
     class oya {
       public $oyaPara="親のメソッド";
       public function oyaMsg(){
         print $this->oyaPara."<br>";
       }
     }
     class ko1 extends oya {
       public $ko1Para="子1のメソッド";
       public function ko1Msg(){
         print $this->ko1Para."<br>";
       }
     }
     class ko2 extends oya {
       public $ko2Para="子2のメソッド";
       public function ko2Msg(){
         print $this->ko2Para."<br>";
         print $this->oyaPara."<br>";
       }
     }
     $ko1Obj=new ko1();
     $ko2Obj=new ko2();
     $ko1Obj->ko1Msg();
     $ko1Obj->oyaMsg();
     $ko2Obj->ko2Msg();
   ?>
   </body>
   </html>