残念ながら私は毎日業務でプログラムを書いているわけではないので、色々やっているうちに忘れてしまう危険があります・・・!!そんなわけで、プログラム系もぼちぼち記事にしていこうと思います。
今回はPHPのアクセス権を記事にします。
アクセス修飾子って何もの?
プログラム上で変数やメソッドが同名として重複しないように、変数や関数の有効範囲を指定するもの。複数人で開発する場合とても便利な機能です。かぶって処理があったらバグになってしまいます!
//アクセス権がわかるとクラスが理解出来て、クラスが分かった上でMVCモデルの概要を知ると、フレームワークやCMSの構造がわかってきます。また、アクセス修飾子と似たようなもので、namespaceという記述の名前空間を使ってディレクトリのようにも管理が出来ます。
アクセス修飾子の使い分け
public > protected > private
publicの範囲が最も大きい。
例外でstaticというものもあります。
public
クラス内、クラス外関係どこからでもアクセスが可能です。
protected
そのクラスと継承先クラスからアクセスが可能です。
private
そのクラスからのみアクセス可能です。
関数に関してそのクラスで処理が終わるものとか、チェック系のメソッドはprivate functionで良いです。
Static
クラス指定すれば、インスタンスを生成せずにどこからでも使える。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
## const.php //税率 const ZEI_RITSU = 8; //8% class Zei{ private $rate; //税率取得 public static function getZei(){ $rate = 1 + ZEI_RITSU/100; return $rate; //1.08 } } |
1 2 3 |
<?php Zei::getZei(); |
ほぼ関数!
初期化されない特性があるので、シングルトンパターンに使ったりします。
使い分け
- 継承される元となるクラスのメンバ変数・メソッドはprotected
- そのクラスで処理が済むメンバ変数・メソッドはprivate
privateで済むものに関してはなるべくprivateを使うとクラス内で秘匿化出来て良いですね!
逆にメンバ変数に対してpublic $hogehoge としてしまうとクラスを使う意味が薄れてしまいます。
プログラマは2度同じ処理を書かない。
2度書くことになった同じ処理はクラスや関数にする原則を忘れずに実行すること。そうすれば1箇所を修正すれば共通した処理を修正できるので保守性が向上する。
例えば税率、ソースに直接1.08など記述してしまった場合は、税率変更の度にアプリケーション上のすべての税の記述を探し出して修正することになりますね、恐ろしい。そこで定数や関数にしておくと、1箇所修正すれば良くなるわけです。
継承
また、関数をクラスという集まりにしておくと同じような処理をする時や、似た処理をする時に継承機能がとても便利です。
サイヤ人クラス(エネルギー弾, 尻尾)
↓(継承)
スーパーサイヤ人クラス(エネルギー弾, 尻尾, 惑星を吹き飛ばす)
こんな感じ。
また、アクセス修飾子privateを使えば、この関数は継承させない!といった事も可能になります。
書いてみた
お買い物をする処理を書いてみました。
みかんを買いますよ!
1 2 3 4 5 6 |
$money = 500; $product = "みかん"; $kakaku = 100; $register = new Register($money, $product, $kakaku); |
予算、商品名、価格をRegisterクラスに入れて内部で決済処理を行う流れにします。
public, protected, private, staticのアクセス修飾子を使ってクラスを作っていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
<?php ## const.php //税率 const ZEI_RITSU = 8; //8% class Zei{ private $rate; //税率取得 public static function getZei(){ $rate = 1 + ZEI_RITSU/100; return $rate; //1.08 } } ## cart.php class Cart { private $items; public function __construct(){ $this->items = array(); } public function addItem($item){ $this->items[] = $item; } public function getItems(){ return $this->items; } } ## item.php class Item { protected $name; //商品名 protected $price; //税抜き価格 public function __construct($name){ $this->name = $name; } public function setName($name){ $this->name = $name; } public function getName(){ return $this->name; } public function setPrice($price){ $this->price = $price; } public function getPrice(){ return $this->price; } } ## fruit.php //require_once 'item.php' ; class Fruit extends Item { private $type; public function setType($_type){ $this->type = $_type; } public function getType() { return $this->type; } } ## register.php //require_once 'const.php'; //require_once 'fruit.php'; class Register extends Fruit { private $yosan; //予算 private $zei_kakaku; //税込み価格 private $result; //決済後の予算 public function __construct($_yosan, $_product, $_kakaku){ $this->yosan = $_yosan; parent::setName($_product); parent::setPrice($_kakaku); } public function getYosan(){ return $this->yosan; } //商品税込み価格計算 -- 価格に税をかけます -- public function getZei_kakaku(){ $this->zei_kakaku = parent::getPrice() * Zei::getZei(); return $this->zei_kakaku; } //お買い物関数 -- 予算から税込み価格を引いて残高を出します -- public function getShopping(){ $this->result = $this->yosan - self::getZei_kakaku(); return $this->result; } } ## register_complete.php //require_once 'register.php'; //======================================= $money = 500; //予算 $product = "みかん"; //商品名 $kakaku = 100; //商品価格 //======================================= //作ったクラスで決済処理をするよ! $register = new Register($money, $product, $kakaku); echo <<< EOM あなたの予算:{$register->getYosan()}円<br/> {$register->getName()}の値段:{$register->getZei_kakaku()}円(税込)<br/> <hr/> 残金は{$register->getShopping()}円です。 EOM; //Cart, Fruitクラスの活用、複数商品の決済処理は次回以降で exit(); |
実行結果
あなたの予算:500円
みかんの値段:108円(税込)
残金は392円です。
プログラムはパズルのようでおもしろいですね!
Pythonのライブラリで何か作ったりとか記事にしていけたらと思います。