PHPのprivate使用理由とは?

このQ&Aのポイント
  • PHPのプログラミングにおいて、privateなアクセス権を使う理由について説明します。
  • privateなメンバ変数を使うことで、そのクラス内でしか変数の値を変更できないように制限することができます。
  • publicなアクセス権を設定した場合、他のクラスや外部からその変数の値を書き換える可能性があるため、情報のセキュリティを確保するためにprivateを使用することが推奨されています。
回答を見る
  • ベストアンサー

PHP,privateの使用理由について

初心者PHPプログラマーです。 質問させて頂きます。 アクセス権に関して、そのクラス内でしか使わないメンバ変数等はprivateで定義した方が良いというのをあちこちのサイトで目にします。 その理由に関してはpublicで指定した場合、値が?書き換えられる可能性があるからということをよく耳にしますが、 この書き換えられるというのはどういうことなのでしょうか? これは [$aaa = 0;]と、定義しているメンバ変数を [$aaa = 3;]と、書き換えられる可能性があるということでしょうか? 現状よく理解出来ていない状態でprivateなどを使い分けています。 初歩的な質問かとは思いますが、ご存知の方がいらっしゃいましたら、よろしくお願い致します。

  • PHP
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 「オブジェクト指向 カプセル化」のような単語で検索するといろいろ出てくると思います。 簡単に言うと、publicですと利用先のクラスから直接値を書き換えることができ、意図しない動きになる可能性があります。 (プログラム時に注意すれば良いのですが、変数名が似ていたり等いろいろ要因はあります) 誰かによって書き換えられるのではなくコーディングミス等で書き換えられてしまう可能性あるということです。 または仕様変更時に、勝手に変数にアクセスしているとそこを全て変更しなければいけなくなったりします。 なのでクラス内の変数は全てprivateで定義し、getter,setterと呼ばれるメソッドを用意して、クラス内の変数にアクセスできるように作ります。

non05410
質問者

お礼

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

その他の回答 (1)

  • t_ohta
  • ベストアンサー率38% (5078/13272)
回答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(); // ここではエラーになる クラスの機能を阻害するような操作が外からできてしまいました。 そもそもメンバ変数はクラス内で使う共通な値を保持するために使うもので、クラスの独立性という面からも外から値を書き換えさせない事が理想だと思いますし、外部からのアクションで書き換えたいならメンバ変数の中身を書き換える関数を用意してあげるといいと思います。

non05410
質問者

お礼

分かりやすい例まで記述して頂き本当にありがとうございます。 今までは「$objF->a = 3;」という記述に対して、誰が何のためにと悩んでいた点が大きかったです。 決して悪意ある記述というわけでは無かったのですね。 また、クラスの独立性など改めて考えるきっかけとなりました。 本当にありがとうございました。

関連するQ&A

  • PHPでサブクラスからスーパクラスのprivate

    メンバにアクセスできる件について PHPでスーパークラスで定義したprivateのメンバにサブクラスからアクセスできる件について 質問です。 class TestClass { private $value01 = "スーパークラスの private メンバ"; public function testMethod01 () { print "スーパークラスのパブリックメソッド"; print "<h1>{$this->value01}</h1>"; } protected function testMethod02(){ print "スーパークラスの protected メソッド"; } private function testMethod03(){ print "スーパークラスの private メソッド"; } public function getMethodList(){ print_r(get_class_methods($this)); } } class ExClass extends TestClass{ private $value01 = "サブクラスの private メンバ"; } $obj = new ExClass(); $obj-> testMethod01(); と上記のようにサブクラスのインスタンスから継承したpublicなメソッド testMethod01()を実行すると スーパークラスのprivateなプロパティにアクセスできてしまいます。 これってどういうことでしょうか?privateメンバってそのクラスの中からだけしかアクセスできませんよね? 上記では、サブクラスからアクセスしているような状態にみえますがどういうことでしょうか? ご教授御願い致します。

    • ベストアンサー
    • PHP
  • PHPのprivate関数について

    PHPのアクセス修飾子privateについてお聞きします。 以下のようなコードを書いて実行したら、エラーメッセージが出ました。 code: <?php class Super { protected function protectedFunc(){ echo "original-Protected\n\r"; } private function privateFunc(){ echo "Private\n\r"; } public function publicFunc(){ privateFunc(); } } $super = new Super; $super->publicFunc(); ?> error message: Fatal error: Uncaught Error: Call to undefined function privateFunc() in C:\xampp\htdocs\HTML_practice\protected-practice.php:12 Stack trace: #0 C:\xampp\htdocs\HTML_practice\protected-practice.php(17): Super->publicFunc() #1 {main} thrown in C:\xampp\htdocs\HTML_practice\protected-practice.php on line 12 line12 というのは、public 関数であるpublicFunc() の内側で、private関数のprivateFunc() を使おうとした部分ですが、private関数はクラス定義の中だから使えるというのは間違った認識でしょうか? だとするとprivate関数はいつどんな時に使えるのでしょうか? どなたか例を挙げて説明頂けないでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPでの継承について

    PHPの継承についての質問です。 PHPではクラスを継承する場合 スーパークラスのpublicとprotectedなメンバを継承すると いいます。 継承とは、スーパークラスで定義したメンバが サブクラスで定義されたことと同義である。 という前提で質問します。 ひょっとしたらこの前提も微妙に間違っているかもしれません。 以下の用なコードがあるとします。 <?php class AClass { //サブクラスへ継承されるスーパークラスのメソッド public function superClassPublicMethod(){ //【1】 $this-> subClassPrivateMethod(); } } class BClass extends AClass{ public function subClassPublicMethod(){//【2】 $this->subClassPrivateMethod(); } //継承したスーパークラスで定義されているメソッドからコールするサブクラスで定義したメソッド private function subClassPrivateMethod(){ //【3】 print __CLASS__; } } $obj = new BClass(); //サブクラスで定義した public なメソッドを実行 $obj->subClassPublicMethod(); //【4】 //スーパークラスから継承したpublic なメソッドを実行 $obj-> superClassPublicMethod();//【5】 ?> コレを実行すると【4】はきちんとBClassという結果が返ってきます。 ところがその下の【5】を実行すると Fatal error: Call to private method BClass::subClassPrivateMethod() from context 'AClass' in /usr/local/apache/htdocs/ext06.php on line 9 という実行時エラーが返ってきます。これを読むと、AClassのコンテキスト内ではBClassのprivateなメンバは コールできませんよ。というエラーですね。そもそもAClassのコンテキストということは、これはAClass内で実行されているということですよね? ここで、スーパークラスからこのpublicなメソッドは継承しているはずなのになぜ、サブクラスのBCLass内ではなくスーパークラスのAClass内という エラーが返っているのでしょうか? 継承とは、サブクラスで定義したと同義ではなく、スーパークラスまで内部的にアップキャスト?してコールしにいっているのでしょうか? 詳しい方ご教授ください。 よろしく御願いします。

    • ベストアンサー
    • PHP
  • C++でfriendクラスにしているのにprivateメンバにアクセスできない

    C++でメンバ変数をprivateにして、特定のクラスにだけ公開するようにクラスをfriend指定したのですがprivateメンバにアクセスできませんとエラーが吐かれてしまいます。 先行宣言したりもしてみたのですがどうしても使用できません。 何か心当たりのあるかた教えてください。 class A { friend class B; private: int a; }; class B { public: void test( A *a ) { a->a = 0; } }; コードは違いますがこんな感じのことをしたいのです。 /* コンソールで小さなプログラムでテストしてみると動くのにいざ実際のソースに組み込むと動かないという奇妙な状態です。よろしくお願いします。 */

  • PHPで値を出力

    初歩的なことだと思うのですが リファレンス読んでもわからないので・・・ a.htmlでとってきた値をb.phpでエラーかどうかをを判断して、エラーならerror.htmlにb.phpで指定した変数の値(例:「~~のためエラーです」みたいなもの)を出力したい場合、どのようにすればいいのでしょうか。

    • 締切済み
    • PHP
  • privateのメンバ変数を直接取得するユーティリティ。

    privateのメンバ変数を直接取得するユーティリティ。 以前、あるプロジェクトでクラスのprivateメンバ変数をgetterメソッドがないのに直接取得できるクラスを使っているのを見ました。 オブジェクトとメンバ変数とかを引数に渡すと、Object型で返却されるようなテスト用のユーティリティクラスみたいでした。 クラスやパッケージなどを確認しなかったので、もしかしたらそのプロジェクトで独自に作ったのかもしれません。 ただオープンソースとかで存在するのであればテストに便利なので利用したいと考えています。 できればsetterメソッドがないprivateメンバ変数に設定できるクラスがあるとよいのですが・・・。 ご存知でしたら是非おしえてください。 希望している経緯はWebアプリケーションのクラスを作成すると、コンテナのオブジェクトがないと動かない場合も多く、単体試験がやりにくいのです。 easymockなど色々ありますが、生成したオブジェクトを対象クラスに渡してあげる必要があるものが多く(staticメソッドは対象外とか)、テストのためにsetterメソッドを実装する必要があります。 個人的には単体試験をやりやすくするために、本番では使用しないメソッドになるけれど、上記のようなsetterメソッドを作成するのはよいと考えています。 依存性を少なくさせて(意味が違うかもしれませんが)、試験がしやすくなれば保守性もあがるし、バグの発生率も少なくなると思っています。 ただ人によっては本番で動かないメソッドがあるのはおかしいという人もいます(実際に言われました)。 確かにそういう考えもあるかと思いますし、以前は私もそう思っていました。 試験のためのメソッドをクラスに作成する考えについても(主にテスト用なのでprotectedで作成しています)、やめた方がいいなどのアドバイスを頂けると嬉しいです。

    • ベストアンサー
    • Java
  • PHPのセキュリティが弱い理由は概念を掴みにくいClassを使わないプログラマーが多いため!?

    思ったけど、PHPのセキュリティが弱いのは、もしかしてClassのアクセス制限修飾子(private,public,protected)を使うことが少ないからでしょうか?Javaは最初からそれをやらなければならないから、セキュリティが強いと思うけど…。 ということは、PHPプログラマは皆、Classというオブジェクト指向の難しさを嫌がるため、Classを使わないプログラムが多く出回っているのが現状ではないでしょうか。 皆さんのご意見もお願いします。

    • ベストアンサー
    • PHP
  • $GETが取得できない場合に指定の値を使う

    PHPでURLから変数を取得できるGETというのがありますがURLにこの値が指定されていない場合に指定した値を使うことは可能でしょうか? つまりこういうことです。 $aaa = $_GET['bbb']; としている場合にURLを ~/index.php?bbb=0000 とした場合は aaa=0000 となりますが、 ~/index.php としかしなかった場合はaaaの値は取得できずにエラーになってしまうため、このaaaの値を強制的に1111に指定し aaa=1111 としてphpプログラムを続行させたいのです。 そのようなことはできますか?

    • ベストアンサー
    • PHP
  • PHPでセッションに入れたクラスの変数が消える

    こんにちは。 PHPでセッションを使っていて困ったことが怒りました。 セッションに入れたクラスインスタンスの中の変数が消えます。 一回目に参照したときは残っていますが、 2回目アクセスした時には無くなってます。 クラスインスタンスのメンバー変数に文字列など、PHP標準のものは残ってますが、メンバー変数にインスタンスを入れると、消えることが判明しました。 これはなぜですか?? よろしくお願いします。

    • 締切済み
    • PHP
  • phpのオブジェクトの使用方法について

    プログラミングはPHPが初めてで、プログラミングというもの自体に慣れていないこともあり、初心者用の本を買ってそれに従って進めているのですが、オブジェクトのところで理解するのに行き詰まってしまいました。 検索してみたものの、以下のページがわかりやすそうだったのですが、これらを読んでみてもいまいちしっくりときません。 http://www.komonet.ne.jp/~php/chap10.htm http://www.stackasterisk.jp/tech/php/php03_09.jsp オブジェクト指向のコンセプトは把握できているつもりです。いつでも使い回しができるコードの束のようなものだと理解しています。しかし、その用法で今まで自分が読んできたものと違うことがあり、また、それらを使用する必然性にたいする理解ができません。いったいどういったタイミングで使用するのでしょうか?以下にそれらの例を挙げて見ました。 1.var $aaa = "hoge"; このvarはいったいどこからやってきたのでしょうか?それに関する解説が本にもWEBにも見つけられなくて困っています。これはクラスの定義内でのみ有効なのでしょうか?何のために使用するのでしょうか? 2.$this -> aaa これをなぜ、単に$aaaと表記しないのでしょうか? 3.プロパティ(property) なぜクラス内の変数(variable)をわざわざそう呼ぶのでしょうか? 4.メソッド(method) なぜクラス内の関数(function)をあえてそう呼ぶのでしょうか? 5.コンストラクタ(Constructor)、継承(Inheritance) 1~4の部分で躓いているためか、いまいちその必要性が理解できません。 もしご存知の方おられましたご教授していただけるとうれしく思います。

    • ベストアンサー
    • PHP

専門家に質問してみよう