初心者PHPプログラマーです。
質問させて頂きます。
アクセス権に関して、そのクラス内でしか使わないメンバ変数等はprivateで定義した方が良いというのをあちこちのサイトで目にします。
その理由に関してはpublicで指定した場合、値が?書き換えられる可能性があるからということをよく耳にしますが、
この書き換えられるというのはどういうことなのでしょうか?
これは
[$aaa = 0;]と、定義しているメンバ変数を
[$aaa = 3;]と、書き換えられる可能性があるということでしょうか?
現状よく理解出来ていない状態でprivateなどを使い分けています。
初歩的な質問かとは思いますが、ご存知の方がいらっしゃいましたら、よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
こんにちは。
「オブジェクト指向 カプセル化」のような単語で検索するといろいろ出てくると思います。
簡単に言うと、publicですと利用先のクラスから直接値を書き換えることができ、意図しない動きになる可能性があります。
(プログラム時に注意すれば良いのですが、変数名が似ていたり等いろいろ要因はあります)
誰かによって書き換えられるのではなくコーディングミス等で書き換えられてしまう可能性あるということです。
または仕様変更時に、勝手に変数にアクセスしているとそこを全て変更しなければいけなくなったりします。
なのでクラス内の変数は全てprivateで定義し、getter,setterと呼ばれるメソッドを用意して、クラス内の変数にアクセスできるように作ります。
回答ありがとうございます。
>誰かによって書き換えられるのではなくコーディングミス等で書き換えられてしまう可能性あるということです。
そういうことだったのですね!
今までは悪意ある書き換えから守るためにと思っていましたが、その場合誰がどうやって?と悩んでいたので、これで納得することが出来ました。
本当にありがとうございました。
No.2
- 回答日時:
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(); // ここではエラーになる
クラスの機能を阻害するような操作が外からできてしまいました。
そもそもメンバ変数はクラス内で使う共通な値を保持するために使うもので、クラスの独立性という面からも外から値を書き換えさせない事が理想だと思いますし、外部からのアクションで書き換えたいならメンバ変数の中身を書き換える関数を用意してあげるといいと思います。
分かりやすい例まで記述して頂き本当にありがとうございます。
今までは「$objF->a = 3;」という記述に対して、誰が何のためにと悩んでいた点が大きかったです。
決して悪意ある記述というわけでは無かったのですね。
また、クラスの独立性など改めて考えるきっかけとなりました。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Visual Basic(VBA) vba Sleep関数について教えてください 1 2023/01/18 10:18
- Visual Basic(VBA) VBA。複数のChangeイベントをまとめる方法 2 2022/03/31 12:03
- PHP PHPで訪問回数を表示するカウンタを作成したい 3 2023/05/27 07:09
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- その他(法律) 普通車の名義変更を行わない(行えない)場合のデメリットについてお聞かせください。 状況 夫 普通自動 9 2022/09/23 08:03
- Gmail SPFレコードとDNSサーバーについて、gmailを設定できるかどうか 2 2023/06/10 23:55
- 英語 口頭での"the following..."の可否等について 6 2022/08/19 01:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
配列とオブジェクトの違い
-
ラッパークラスって何ですか?
-
phpのクラスメソッドの定義が長...
-
php インスタンスとオブジェク...
-
onedrive にexcelファイルをア...
-
フォントの色を変えるには?
-
バッチを用いたフォルダの自動移動
-
phpとaspの違いについて
-
form actionで二つ送信先を指定...
-
phpで画像がどうしても文字化け...
-
透過PNGが透過されない!!
-
PHP8を使うと、大量のWarningが...
-
index.phpって何ですか? 具体...
-
PHPで、エラーがない場合のみ画...
-
これの対応OSを教えて下さい。p...
-
ワードプレスサイト PHP8.0.25...
-
PHPからロリポップ!のメールサ...
-
PHPで複数ファイルのダウン...
-
PHPをhtmlに読み込んだファイル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
ラッパークラスって何ですか?
-
phpのクラスメソッドの定義が長...
-
class定義のphpをファイル分割...
-
PHP4、PHP5 1ファイル複数クラ...
-
phpのクラスにて別ファイルの変...
-
'_'(アンダースコア)の使い方...
-
コンストラクタで参照渡しをす...
-
データベースで値をインクリメ...
-
クラス
-
【PHP】クラス と 関数 の違い
-
ユーザ定義関数にデフォルト引...
-
PHPのフレームワークの中でSmar...
-
phpのオブジェクトの使用方法に...
-
phpでクライアントのブラウザの...
-
配列とオブジェクトの違い
-
POSTとGET
-
Codeigniter コアクラスの継承
-
外部ファイルのクラスのインス...
-
class.upload.phpの戻り値(返...
おすすめ情報