#private, protected, publicについて
privateを使用するようになるとアクセサを使用する
private $name;
public function getName()
{
return $this->name;
}
上記のgetName(){}のようにprivateにされたプロパティを外部から読み取りのみ出来るようにする為に設定するメソッドをアクセサという。
過去記事の例を参考にアクセス権を付与した例が以下
※過去記事
PHP 基本 extends(この記事の内容は学習中)
###例)
<?php
//Entreeクラスの拡張
//親クラス
class Entree
{
private $name;
protected $ingredients = [];
public function getName(){
return $this->name;
}
public function __construct($name, $ingredients)
{
if (!is_array($ingredients)) {
throw new Exception('$ingredientsは配列を指定してください');
}
$this->name = $name;
$this->ingredients = $ingredients;
}
public function hasIngredient($ingredient)
{
return in_array($ingredient, $this->ingredients);
}
}
//子クラス
class Zensai extends Entree
{
public function __construct($name, $entrees)
{
parent::__construct($name, $entrees); // Entreeのコンストラクタを参照
foreach ($entrees as $entree) {
if (!$entree instanceof Entree) {
throw new Exception('Elements of$entrees must be Entree objects');
}
}
}
public function hasIngredient($ingredient)
{
foreach ($this->ingredients as $entree) {
if ($entree->hasIngredient($ingredient)) {
return true;
}
}
return false;
}
}
//インスタンス
$soup = new Entree('鳥スープ2', ['chicken', 'water']); //スープインスタンス
$sandwich = new Entree('鳥サンド', ['chicken', 'bread']); //サンドイッチインスタンス
$zensai = new Zensai('Soup + Sandwich', [$soup, $sandwich]); //前菜インスタンス
foreach (['chicken', 'water', 'pickles'] as $ing) {
if ($zensai->hasIngredient($ing)) {
if ($zensai->hasIngredient($ing)) {
print "前菜には食材({$ing})が含まれている.\n";
}
}
}
結果
/*
前菜には食材(chicken)が含まれている.
前菜には食材(water)が含まれている.
*/
上記例ではプロパティprotected $ingredients = [];
をpravateにするとエラーになる。