PHP カプセル化とは?

クラス化・オブジェクト指向ではカプセル化という概念が出てきます。
簡単に説明するとクラス外からの利用を制限し、修正を最低限に抑えるという事です。
処理を中に閉じ込めるという感じでしょうか。
クラス内のフィールド(メンバ変数)や処理(メソッド)は修飾子でアクセス制限をできます。
この制限はなぜするのかという事にもつながります。
実際にコードを書いてみます。

class Product
    {
    public $name;
    }
$prduct = new Product();
$prduct ->name = 'スパナ';
echo '商品は'.$prduct ->name . 'です。';
上記のような形でショッピングサイトで$prductに商品名を入れて処理を上記で行う場合、
もし商品名が無い場合は未登録という分岐させて処理を行うとなった場合、
class Product 
    { 
    public $name; 
     } 
$prduct = new Product(); 
$prduct ->name = 'スパナ'; 
$name = '未設定'; 
// もし$prduct->nameが設定されてなかったらの分岐
if ($prduct ->name != '') 
{ 
//$nameを$prduct ->nameに入れる
$name = $prduct ->name; 
} 

修正が出た場合、分岐してある部分を洗い出して修正しなければならない事になります。
逆にフィールドをprivateにした場合を書いてみます。

class Product 
{
private $name; 
public function setName($name) 
{ 
$this->name $name; 
} 
public function getName() 
{ 
return $this->name; 
} 
} 

$prduct = new Product(); 
$prduct->setName('スパナ'); 
echo '商品は'.$prduct->getName() . 'です。'; 
続いて未設定だった場合の分岐をします。
  class Product { 
private $name; 
public function setName($name) 
{ 
$this->name $name; 
} 
public function getName() 
{ 
if ($this->name == ''){ 

return '未設定'; 
} else { 
return $this->name; 
} 
} 
}


$prduct = new Product();
$prduct->setName('スパナ');
echo $prduct->getName() ;
   
public function getName() 内に分岐を入れてそこで処理をしています。
こうする事で、クラスの一箇所を変更するだけ全てのコードを修正する事ができます。

ここで、var を使うケースも有るので、テストしてみます。

<?php
class test {
var $name1 = "テスト";
public $name2 = "テスト";
private $name3 = "テスト";
public function getName()
{
echo $this->name3."privateを出力";

}

}
$test = new test();
echo $test->name1;
echo $test->name2;
//echo $test->name3; ←これはエラーになります。
echo "<br>";
$test->getName();
$test->name1 = "変更テスト";
echo "<br>";
echo $test->name1;
//$test->name3 = "変更テスト";//←これはエラーになります。

?>


テストテスト
テストprivateを出力
変更テスト

もし”100円”など出力があった場合、変数に数値がないものが入った場合などはどうでしょう。
やはりバリゲードが必要になります。
フィールドはprivateにし、隠すものは隠してセットゲットする。というのが基本になります。
それがカプセル化です。