継承とは
継承はクラスを拡張するための手段です。
class 子クラス extends 親クラス
と記述することで、子クラス内で親クラスのメソッドやプロパティを利用できるようになります。
<?php
//親クラス
class Country
{
$name = "";
$language = "";
public function setName($name)
{
$this->$name = $name;
}
public function getName()
{
return this->$name;
}
public function setLanguage($language)
{
$this->$language = $language;
}
public function getLanguage()
{
return this->$language;
}
}
//子クラス
class Japan extends Country
{
public function speak()
{
echo "日本語";
}
}
ここから継承していきます。
<?php
require_once("Country.php");
require_once("Japan.php");
$hoge = new Japan();
$hoge->setName("しんたろう");
$hoge->setLanguage("Japanese");
上記のようにJapanクラスはsetName()やsetLanguage()は記述されていませんが、クラスを継承しているためクラスをコピーして作られた$hogeもまたこれらのメソッドが使えるわけです。
継承とprotected
クラスを継承することで親クラスのプロパティやメソッドを利用できることはわかりました。では親クラスではこのプロパティはどのように定義するべきなのでしょうか。
大規模なプログラムでは変数の修飾子として、三つの修飾子が出てきます。これを使い分けることが、アプリケーションを作る上で肝となってきそうです。まずこの3つの役割を確認します。
public どこからでもアクセス可能
protected 定義されているクラス自身と継承しているクラス内でアクセス可能
private そのクラス内でのみアクセス可能
下に行くほどアクセスが厳しくなっていきます。なぜ上記のようにアクセス制限する必要があるかというと、オブジェクト指向の大切な考え方として、「カプセル化」があります。カプセル化は変数や関数の呼び出しを制御することを指します。カプセル化の目的は「想定しないクラスからのアクセスを防ぐ」ことにあります。
大規模なプログラムであるほど、クラス、変数、関数の量が膨大になり管理が難しくなっていきます。プログラムを無闇にpublicを使ってデータを定義すると、万が一障害が起きた際に呼び出されている箇所を全て調査し修正しなければいけなくなります。
なので関数や変数は極力クラス外で呼び出さないようにする→そのほうが保守性の高いクラスということになります。
では修飾子はどのような基準で決めていけばいいのでしょうか。基本の考え方としてはprivateで定義し、必要に応じてアクセス権を広げていくべきです。具体的には他のクラスでも継承して、利用することが考えられるプロパティはprotectedで定義してあげます。また外部で関係のないクラスから呼び出す場合はpublicを利用してあげるべきです。
記事を書くうえで下記を参考にさせていただきました。
https://tech-blog.rakus.co.jp/entry/20211217/php#%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96