31日目:PHP 学習:カプセル化、フォームのデータ授受、クラスプロパティ/メソッド、クラスの細分化 (private, static, extends)
<学習日>
31日目
<学習内容>
① PHP Ⅱ(67-100%):カプセル化してフォームを作成する (private、フォームを使用したデータ授受)
② PHP Ⅲ(0-50%):クラス固有の値を適用する/クラスの細分化をする (クラスプロパティ、継承。独自プロパティ/メソッド)
<参考>
Progateレベル:142
<学習内容詳細>
本日は少し進みが多かったですね^^
カプセル化(外からデータの改ざんが出来ないようにする仕組み)という技術と、クラスを実用的に使用する方法について勉強しました。
① PHP Ⅱ(67-100%):カプセル化してフォームを作成する (private、フォームを使用したデータ授受)
前半はカプセル化について勉強しています^^
カプセル化は外からの「データ改ざんを制限する」機能となるのですが、容易に変更が出来なくなるので、データの読み取りにひと手間加えることになります!
さっそく、具体的なcode例を挙げながら、確認していきましょう^^
・外部からクラスのプロパティの変更を制限する場合
クラスのプロパティを読み取り専用にするようなcodeをかく。具体的には「public」で指定していたプロパティを、「private」で指定すればOK。
ただこのままだと、プロパティの値を読み取れなくなってしまうので、クラス内で値を取得するだけの関数を記述する必要がある。
具体的なcodeは以下のとおり。
private $age;
public function getAge(){
return $this->age
}
<p><?php echo getAge() ?></p>
・変数に初期値を入れる場合
たとえば、年齢の初期値を10にしたい場合は、以下のcodeのとおり。
private $age = 10;
・値をセットする場合
変更したい変数がprivateだと変更することができないので、セッターとゲッターを組み合わせる。また、変数には初期値を指定することが出来る。
たとえば、年齢について特定の値を入れたい場合、以下のようなcodeとなる。
private $age =0;
public function setAge($age){
this->age = $age;
}
public function getAge{
return this->age;
}
・<form>を使用して、別のページに入力した値を飛ばす
たとえば、入力画面で年齢を入力して、次の確認ページ(confirm.php)で表示する場合、以下のようなcodeとなる。なお、クラスの方で名前は既に取得済みとしている。
入力フォーム側
<form method="post" action="confirm.php">
<input type="text" value="10" name="<?php echo $men->getName() ?>">
</form>
確認画面側
<?php $age = $_POST[$men->getName()]?>
<?php echo $men->getName() ?>
<?php echo $age ?>
ポイントは、入力フォーム側の<input>で定めているname属性が「実際に入力された値を$_POST[$men->getName()]という受け手側の引数に代入する」という構文になっていること。
ややこしいのは、クラス側で定めている名前を$men->getName()としている点で、かなり混同しやすいので注意。
また、この上でフォームに入力した年齢を出力したい場合には、セッターの呼び出しとして以下のcodeとすればよい。
echo $men->setAge($age)
$ageに実際に入力された数字が入り、それを引数としてセッターの値として取得する。
なんでこんな回りくどいことをするかというと、複数の男のデータを並べたいときにforeach関数を使用するが、各々の男の情報を引き出すときにクラスを介する必要があるからである。
・クラス内で変数や関数を呼び出す場合の注意点
「必ず$this->をつけること」
これがルールみたい
② PHP Ⅲ(0-50%):クラス固有の値を適用する/クラスの細分化をする (クラスプロパティ、継承。独自プロパティ/メソッド)
オブジェクト指向というタイトルになっていますが、つまるところクラスを使いこなそうということです^^
今回新しい概念として「クラスプロパティ」と「クラスメソッド」が出てきました。
これはクラスが「枠+値」をもつことが出来る、ということです。
前回までだと、クラスは単純に枠を規定するものであり、「具体的な値はもたない」ものでした。
なので、インスタンスを作成することで、その枠にあてはまる値を格納するという使い方でした。
「クラスプロパティ」や「クラスメソッド」では、最初から値も持っているので、そのままデータを取り出しり、活用することが出来るという点がポイントです。
具体的なcodeを見ながら、確認していきましょう^^
・クラスプロパティ/クラスメソッドの記述方法について
クラスプロパティ/メソッドとは、クラスで値まで持たしているプロパティ/メソッドのことである。
具体的なcodeは以下のとおり(private指定も可能)。
public static $プロパティ名;
public static function $メソッド名;
ポイントは「static」を記述することだけ。
・インスタンスごとのプロパティと、クラスのプロパティの違いについて
クラスで定義しているのは基本的に「枠組み」だけで、具体的なプロパティに格納される値が、はインスタンスを生成するまでは空白の状態である。
なので、クラス名から直接プロパティの値を取り出すことが出来ない(必ずインスタンスと紐づけて、値を取り出すようになっている)。
上記と区別する形で、クラス自体で固有の値を持たせているものが「クラスプロパティ」である。
これはクラス自体で枠+値を有しているので、インスタンスを生成しなくても、直接読み取ることが可能である。
具体的にMenという名前のクラスから、クラスプロパティ$countの値を取り出すには、以下のcodeとなる。
echo Men::$count
インスタンスと紐づけたプロパティの値を取り出すときの「echo $men->age」、メソッドを呼び出すときの「echo $men->sum()」と確実に区別したい。
ようは「::」か「->」かの違い。
・クラスの継承
例えば、大枠としてMenというクラスを作っていたけれど、右利きと左利きとでちょっと違うクラスとしたい場合、もとのMenクラスの内容を引き継いで、新しいクラスを作ることができる。
引き継いだ内容に追加して、プロパティやメソッドを追加するとして、具体的なcodeは以下のとおり。
class Lefter extends Men {
public $プロパティ名;
public $メソッド名;
}
今日はかなり盛沢山でしたが、以前の言語で学んだことが中心だったので、さくさくと進められたと思います!
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!