初心者PHPプログラマーです。
質問させて頂きます。
アクセス権に関して、そのクラス内でしか使わないメンバ変数等はprivateで定義した方が良いというのをあちこちのサイトで目にします。
その理由に関してはpublicで指定した場合、値が?書き換えられる可能性があるからということをよく耳にしますが、
この書き換えられるというのはどういうことなのでしょうか?
これは
[$aaa = 0;]と、定義しているメンバ変数を
[$aaa = 3;]と、書き換えられる可能性があるということでしょうか?
現状よく理解出来ていない状態でprivateなどを使い分けています。
初歩的な質問かとは思いますが、ご存知の方がいらっしゃいましたら、よろしくお願い致します。
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;」という記述に対して、誰が何のためにと悩んでいた点が大きかったです。
決して悪意ある記述というわけでは無かったのですね。
また、クラスの独立性など改めて考えるきっかけとなりました。
本当にありがとうございました。
No.1ベストアンサー
- 回答日時:
こんにちは。
「オブジェクト指向 カプセル化」のような単語で検索するといろいろ出てくると思います。
簡単に言うと、publicですと利用先のクラスから直接値を書き換えることができ、意図しない動きになる可能性があります。
(プログラム時に注意すれば良いのですが、変数名が似ていたり等いろいろ要因はあります)
誰かによって書き換えられるのではなくコーディングミス等で書き換えられてしまう可能性あるということです。
または仕様変更時に、勝手に変数にアクセスしているとそこを全て変更しなければいけなくなったりします。
なのでクラス内の変数は全てprivateで定義し、getter,setterと呼ばれるメソッドを用意して、クラス内の変数にアクセスできるように作ります。
回答ありがとうございます。
>誰かによって書き換えられるのではなくコーディングミス等で書き換えられてしまう可能性あるということです。
そういうことだったのですね!
今までは悪意ある書き換えから守るためにと思っていましたが、その場合誰がどうやって?と悩んでいたので、これで納得することが出来ました。
本当にありがとうございました。
お探しの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のクラスメソッドの定義が長...
-
「クラス関数」「メンバ関数」...
-
onedrive にexcelファイルをア...
-
こちらはただの直列処理ですか?
-
ワードプレス、Contact Form 7...
-
拡張子php画像をjpg画像等に変...
-
PHPとCSVで簡易データベースな...
-
include先でのinclude元の変数...
-
リダイレクト元のURLの取得方法...
-
メールフォームのタイトルが文...
-
php エラー
-
PHPのif文でその処理を途中で抜...
-
VBでメールを送る時のSMT...
-
one drive のアップロード失敗...
-
別PHPファイルに変数を渡す
-
ワードプレスサイト PHP8.0.25...
-
パースエラーとは?
-
Image Magickの関数が使えない
-
文字化けで混乱中です...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
phpのクラスメソッドの定義が長...
-
ラッパークラスって何ですか?
-
'_'(アンダースコア)の使い方...
-
class定義のphpをファイル分割...
-
配列とオブジェクトの違い
-
PHP4、PHP5 1ファイル複数クラ...
-
関数定義の関数名の前にある&(...
-
php、可変プロパティ名について
-
クラス設計の良い参考書を教え...
-
phpのクラスにて別ファイルの変...
-
class.upload.phpの戻り値(返...
-
【PHP】クラス と 関数 の違い
-
php インスタンスとオブジェク...
-
Re: Cookieを使ってオブジェク...
-
PHPでサブクラスからスーパクラ...
-
クラス
-
onedrive にexcelファイルをア...
-
フォントの色を変えるには?
-
index.phpに入るには、どうすれ...
おすすめ情報