【オブジェクト指向2】インスタンスの生成

おさらい

【オブジェクト指向1】クラスの作成で以下まで記述した。

<?php
class Player {
    public $name;
    public $sex;
    public $year;
    public $job;
    public $nation;
    
    public function confirm(){
    echo "私の名前は" . $name . "です。\n職業は" . $job . "の" . $nation .  "です。";
    }
}
?>

インスタンスの生成

なぜ、変数とメソッドをまとめたクラスを作ったか。それをもとに複製するため。
これをしないのであればclassじゃなくて普通に記述すればOK。

そして、classから複製、つまり同じ機能を保持した者たちをclassとは呼ばずに、インスタンスと呼ぶ。

<?php
   $player = new Player();
?>

これだけでインスタンスを生成した。何をしたか。
new演算子というらしいが、要はその後ろにコピー元のclassを記述。
そして変数に代入することでオリジナルの名前を付けてあげたのだ。
Playerクラスの機能を持って外の世界へ冒険に行く感じ。


アクセス方法

インスタンスはclassの変数やメソッドを使える。

<?php
$player = new Player();
$player->name = 'Nakamura';

echo $player->name;
?>

インスタンス変数の後ろに「->」アロー関数をつけ、さらにclassの変数($抜き)を記述してアクセスできる。
メソッドもいけるよ。

<?php
class Player {
    public $name;
    public $sex;
    public $year;
    public $job;
    public $nation;
    
    public function confirm(){
    echo "私の名前は" . $this->name . "です。<br /> 職業は" . $this->job . "で" . $this->year .  "歳の" . $this->nation .  "です。";
    }
}

//インスタンスの生成
$player = new Player();

//変数の更新
$player->name = 'Nakamura';
$player->sex = 'man';
$player->year = 27;
$player->job = 'WEBディレクター';
$player->nation = '日本人';

//メソッドの呼び出し
echo $player->confirm();
?>


処理結果
私の名前はNakamuraです。
職業はWEBディレクターで27歳の日本人です。

アクセス権

例えば、あと5個増やすとする。あれ、さっき変数変えちゃった。。
そもそも前の記事でclass内の変数ってclass内で過保護にしないといかんでしょ?
テンプレの内容が更新されちゃうのって本末転倒だよね!

そこでclass内の変数を外から変更できないようにpublicの記述をpraivateに変更してロックする。
カプセル化

<?php
class Player {
    private $name;
    private $sex;
    private $year;
    private $job;
    private $nation;
    
    public function confirm(){
    echo "私の名前は" . $this->name . "です。<br /> 職業は" . $this->job . "で" . $this->year .  "歳の" . $this->nation .  "です。";
    }
}

//インスタンスの生成
$player = new Player();

//変数の更新
$player->name = 'Nakamura';
$player->sex = 'man';
$player->year = 27;
$player->job = 'WEBディレクター';
$player->nation = '日本人';

//メソッドの呼び出し
echo $player->confirm();
?>

処理結果
エラー

やることは2つです

1つ目:何とかして変数に代入したい(セット!)

直接アクセスして代入するのはNGなので誰かに値を渡して、代入してもらえればOK。
外部のインスタンス:「class内の変数をいじれる人ー!」
class内のメソッド :「はーーい!!!」

そう、唯一メソッドが可能なので以下をclass内に記述。
・値を受け取る
・変数に代入する
ことだけをするメソッドを記入する必要がある。

<?php
    public function setName($name){
     $this->name = $name;
    }
?>

そしてclassの外で以下を記述して変数に値を渡してセットしてもらって準備完了!!
あれ、、結局直接アクセスできないので呼び出せないや。。。(笑)

1つ目:何とかして変数にアクセスしたい(ゲット!)

外部のインスタンス:「メソッドさーーーん!中継してもいいから変数にアクセスさせて~!」
class内のメソッド :「中継ならいいよー!!!」

以下をclass内に記述。

・ただ、$this->nameをreturnする

ことだけをするメソッドを記入する必要がある。

<?php
    public function getName(){
     return $this->name;
    }
?>

これで以下でセットしてゲットできるぜ!

<?php
$player->setName("Nakamura");
$textname = $player->getName();
echo $textname;
?>

処理結果
Nakamura

次なる疑問

なるほどね~てことは変数ごとにsetしてgetを呼び出せばOKなのか!
他の変数も入れていこう!
・・・・これめんどくね?

外部のインスタンス:「インスタンス生成するんだから自動で代入と呼び出しできないの?」
メソッド:「・・・できます。」
外部のインスタンス:「できんのかい(笑)」


__construct メソッド (コンストラクタ) の利用

getは任意のタイミングで呼び出すからOK。
問題はsetを自動化したい。
__construct メソッド内に記述すると、インスタンス生成時に自動的にその処理を行うよ。
つまり__construct メソッド内に、$this->set〇〇($●●)と記述すればOK!

<?php
class Player {
    private $name;
    private $sex;
    private $year;
    private $job;
    private $nation;
    
    public function __construct($name,$sex,$year,$job,$nation){
        $this->setName($name);   
        $this->setSex($sex);
        $this->setYear($year);
        $this->setJob($job);
        $this->setNation($nation);
    }
      
        public function setName($name){
         $this->name = $name;
        }
        public function getName(){
         return $this->name;
        }
        
        
        public function setSex($sex){
         $this->sex = $sex;
        }
        public function getSex(){
         return $this->sex;
        }
        
        
        public function setYear($year){
         $this->year = $year;
        }
        public function getYear(){
         return $this->year;
        }
        
        
        public function setJob($job){
         $this->job = $job;
        }
        public function getJob(){
         return $this->job;
        }
        
        
        public function setNation($nation){
         $this->nation = $nation;
        }
        public function getNation(){
         return $this->nation;
        }
        
    
    public function confirm(){
    echo "私の名前は" . $this->name . "です。<br /> 職業は" . $this->job . "で" . $this->year .  "歳の" . $this->nation .  "です。";
    }
    
    
}

//インスタンスの生成 
$player = new Player("中村隼","man",27,"WEBディレクター","日本人");
$player->confirm();
?>

処理結果
私の名前はNakamuraです。
職業はWEBディレクターで27歳の日本人です。



ちなみに、記事書いているときにsetメソッド定義部分とget部分まで全部入れてエラーになってました。。(笑)
自動化するのはあくまでsetのコールだけ!!



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

===========