PHP

PHP:コードの考察(クラス・インスタンス・メソッドなど含む)

PHP:コードの考察(クラス・インスタンス・メソッド)

今回のコードでやっていること!(※コードの詳細は1番下)
PHPで、curryとpastaのメニューを作る。
curryのメニューで、メニュー名「CURRY」を
pastaのメニューで、メニュー名「PASTA」を表示する。

<?php
class Menu {
  public $name;
  
  public function __construct($name) {
    $this->name = $name;
  }
  
  public function hello() {
    echo '私は'.$this->name.'です';
  }
}

$curry = new Menu('CURRY');
$pasta = new Menu('PASTA');
?>

<p><?php echo $curry->name ?></p>
<p><?php echo $pasta->name ?></p>

まず、最初にMenuクラスを作る。
クラスは、大枠(骨組みのイメージ)。

クラスの中身は、クラスを作るための構成が書かれていて
今回の場合は、MENUを作るための構成が書かれている。

このMENUの構成(クラス)をもとに、
curry版、pasta版を生成(複製)してくイメージ。
この複製されたものがインスタンスと呼ばれるもので、
その複製されたものに、それぞれ、名前を付けることで、
curry版、pasta版を作っている感じになる。

それが、以下のコード2行。

$curry = new Menu();
$pasta = new Menu();

インスタンス(複製)はnew クラス名()で作ることができ、
それを変数名、今回の場合は、$curryと$pastaにそれぞれ代入することで、
$curry版、$pasta版を作っている。
(変数名の定義がクラスおよびクラス内で行われている処理や定義になってる。)

で、今回のMenuクラスの構成はどうなっているのかというと
まず、public $name;で、$nameというプロパティを作っている。

このプロパティは、CSSとかで出てきた、プロパティと似ていて、
CSSのときは、文字色設定をしたければcolorプロパティを、
フォントサイズを設定したければ、font-sizeプロパティをというように、
すでに、プロパティが決まっていたけど、PHPでは、
このプロパティ自体を自分で決めて良いよという感じになっている!

今回は、メニュー名に対するプロパティが欲しかったので、
public $name;として、メニュー名のプロパティを作っている。

今回のコードでは、記載されていないが、
この$nameプロパティに値を設定するときは、

$curry->name = 'CURRY';
$pasta->name = 'PASTA';

のように「インスタンス(名)->プロパティ名 = プロパティに設定する値」になる。
CSSでいうところの、.クラス名{color: white;}や
.クラス名{font-size: 15px;}にあたる部分。

CSSの場合は、これで、クラス名の文字色を白にしたい、
クラス名のフォントサイズを15pxにしたいとなっている。

今回のPHPでは、
$curryのnameを'CURRY'にしたい、
$pastaのnameを'PASTA'にしたいという感じになっている。

->が使われているように、インスタンス名のプロパティにアクセスしていると
イメージすると特に分かりやすい。

今回は$curryのnameプロパティと$pastaのnameプロパティにアクセスして、
それぞれプロパティに設定したい値を入れているという感じ。

で、これで、確かにプロパティの詳細が設定できるのだが
それぞれ、インスタン(複製)の度に手入力で設定していくと大変なので、
インスタンス(複製)に合わせて、自動でプロパティを設定してくれるようにする。

それが、public $name;の下に書かれている

 public function __construct($name) {
     $this->name = $name;
 }

のコードになる。

このコードの意味は、インスタンスが生成されたら、
そのインスタンスのnameプロパティに$nameという値を設定してね。
で、この$nameが何かというと生成されたインスタンスにある引数だよってこと。

詳しくコードを見ていく。
まず、public function __construct(){}について。

これは、インスタンスに関連する処理を行わせためのコードで
関数を定義しているのと同じ。

{}の外に関数名が、{}の内にその関数が行う処理が書かれている。
この関数のことをPHPでは、メソッドと呼んでいて
関数名がメソッド名にあたる。
※正確に言うと、インスタンス固有の関数=メソッド

メソッド名は、自分で決めることもできるし、
元々ある、特別なメソッド名を使用すると、
そのメソッド名が持つ特有の処理を行うことができる。

メソッドは「public function メソッド名()」のように定義し、
今回は「__cnstruct」というメソッドが使われている。

この「__cnstruct」メソッドが特別なメソッドの1つで
newを用いてインスタンスを生成する際、このメソッドが自動的に呼ばれるようになる。

つまり、インスタンス(複製)を作るだけで、
「__construct」にある処理も自動で行ってくれるというわけ。

これが、インスタンスが生成されたらの部分にあたる。

で、今回、このメソッドに行わせる処理内容が$this->name = $name;
これは、さっき出てきたようにプロパティを設定する処理になる。

違うのが変数名の部分で、さっきは$curry、$pastaのようにそれぞれ
プロパティを設定したいインスタンス名を書いていたが、
今回は、「$this」という特殊な変数を用いている。

この「$this」は、メソッド内でインスタンスのプロパティや
メソッドにアクセスしたいときに使うもので、メソッドが呼ばれたときに
メソッドを呼び出した、インスタンスに置き換えられる。

つまり、$curryのインスタンス内で、呼び出されたら、$thisの部分が$curryに
$pastaのインスタンス内で、呼び出されたら、$thisの部分が$pastaに置き換わる。

今回の場合は、「__construct」メソッドが使われているので、

$curry = new Menu();
$pasta = new Menu();

とインスタンスが生成された瞬間に「__construct」メソッド内に書いた処理
$this->name = $name;の処理がそれぞれ行われ、

$curryのインスタンス内では$curry->name = $name;
$pastaのインスタンス内では$pasta->name = $name;
と$this部分が、呼び出したインスタンスの名前に置き換わる。

で、プロパティに設定した$nameの値をメソッドの引数、
今回の場合、「__construct()」の()内に設定することで、
newインスタンス名()の引数に設定した値がプロパティの設定する値$nameとなる。

これは、newを用いて生成されたインスタンスには引数を与えることができて、
その引数が「__construct」のメッソドに渡される、
さらに、その引数が、メソッドの処理内で、プロパティの値として
設定されていることから成り立っている。

つまり、コードの記述では見えていないが、

$curry = new Menu('CURRY');

と書いただけで、

publick function__construct('CURRY'){
    $curry->name = 'CURRY';
}

という$curryのnameプロパティの設定まで行ってくれている。

$pasta = new Pasta('PASTA');においても同様の処理

public function__construct('PASTA'){
    $pasta->name = 'PASTA';
}
 
を行ってくれている。

なので、最初のように

$curry->name = 'CURRY';
$pasta->name = 'PASTA';

と一つずつ記述していかなくても、

$curry = new Menu('CURRY');
$pasta = new Pasta('PASTA');

とインスタンスを生成した時点でプロパティの設定が行われており、

echo $curry->name;と記述すると、CURRYが
echo $pasta->name;と記述すると、PASTAが呼び出される

コメントを残す

メールアドレスが公開されることはありません。