プロが教える店舗&オフィスのセキュリティ対策術

初心者PHPプログラマーです。
質問させて頂きます。

アクセス権に関して、そのクラス内でしか使わないメンバ変数等はprivateで定義した方が良いというのをあちこちのサイトで目にします。
その理由に関してはpublicで指定した場合、値が?書き換えられる可能性があるからということをよく耳にしますが、

この書き換えられるというのはどういうことなのでしょうか?

これは
[$aaa = 0;]と、定義しているメンバ変数を
[$aaa = 3;]と、書き換えられる可能性があるということでしょうか?

現状よく理解出来ていない状態でprivateなどを使い分けています。
初歩的な質問かとは思いますが、ご存知の方がいらっしゃいましたら、よろしくお願い致します。

A 回答 (2件)

こんにちは。



「オブジェクト指向 カプセル化」のような単語で検索するといろいろ出てくると思います。

簡単に言うと、publicですと利用先のクラスから直接値を書き換えることができ、意図しない動きになる可能性があります。
(プログラム時に注意すれば良いのですが、変数名が似ていたり等いろいろ要因はあります)

誰かによって書き換えられるのではなくコーディングミス等で書き換えられてしまう可能性あるということです。
または仕様変更時に、勝手に変数にアクセスしているとそこを全て変更しなければいけなくなったりします。

なのでクラス内の変数は全てprivateで定義し、getter,setterと呼ばれるメソッドを用意して、クラス内の変数にアクセスできるように作ります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>誰かによって書き換えられるのではなくコーディングミス等で書き換えられてしまう可能性あるということです。
そういうことだったのですね!
今までは悪意ある書き換えから守るためにと思っていましたが、その場合誰がどうやって?と悩んでいたので、これで納得することが出来ました。

本当にありがとうございました。

お礼日時:2012/07/31 17:35

publicでメンバ変数を作ると、以下のようなプログラムでは a_class 内の変数の値がクラスの外から書き換えられてしまいます。



class a_class {
public $a;
public function __construct () { $this->a = 0; }
public function getA () { echo $this->a; }
public function getA2 () { $this->a = 5; echo $this->a; }
}

$objA = new a_class;
$objA->getA(); // ここでは 0 が表示される
$objA->a = 3;
$objA->getA(); // ここでは 3 が表示される
$objA->getA2(); // ここでは 5 が表示される


これが、以下のようなプログラムだと、エラーが発生してしまいます。

class file_class {
public $a;
public function __construct () { $this->a = fopen("hoge.txt", "r"); }
public function getA () { echo fgets($this->a); }
}

$objF = new file_class;
$objF->getA(); // ここでは hoge.txt の中身が1行表示される
$objF->a = 3;
$objF->getA(); // ここではエラーになる

クラスの機能を阻害するような操作が外からできてしまいました。


そもそもメンバ変数はクラス内で使う共通な値を保持するために使うもので、クラスの独立性という面からも外から値を書き換えさせない事が理想だと思いますし、外部からのアクションで書き換えたいならメンバ変数の中身を書き換える関数を用意してあげるといいと思います。
    • good
    • 0
この回答へのお礼

分かりやすい例まで記述して頂き本当にありがとうございます。

今までは「$objF->a = 3;」という記述に対して、誰が何のためにと悩んでいた点が大きかったです。
決して悪意ある記述というわけでは無かったのですね。

また、クラスの独立性など改めて考えるきっかけとなりました。
本当にありがとうございました。

お礼日時:2012/07/31 17:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!