2016-11-25 5 views
2

私はかつて教師にプライベートか保護されているかのようにプロパティーの可視性をいつも使用していたのかと疑問を呈しました。彼女は私に、これを公開するよりも安全だと答えましたが、私は本当にこの答えに自信がありません。だから、最終的なユーザーが私のクラスを操作する方法を持たないことを保証しても、パブリックプロパティは実際にプロパティに対して安全性が低いのですか?どうして ?PHP - 公開された可視性は安全性が低いですか?

+1

で上書きすることができます誤ってパブリックとして宣言されている場合は、任意の多かれ少なかれ安全ではありませんが、それは、クラス全体の機能の利用を制限する方法のより多くのです。 – Rasclatt

答えて

2

パブリックプロパティ自身でより安全か安全でないではありませんを参照してください。しかし、多くの公共財産を所有すると、間接的に安全性の低いアプリケーションにつながる可能性があります。

多くのパブリックプロパティを持つクラスは、自分のメソッドではなくコードの他の部分でこれらのプロパティを操作できるため、推論が難しくなります。このようにして、アプリケーション全体のセキュリティを管理することが難しくなります。

他の言葉では:公共の財産は、より大きなattack surfaceにつながる可能性があります。

7

いいえ、絶対的なごみです。それはもはや安全です。

ユーザーが望んでいた場合、彼らはオブジェクトの上に保護/プライベートプロパティにアクセスすることができます

class Car { 
    protected $engine = 'V8'; 
} 

$reflector = new ReflectionClass('Car'); 
$engineProperty = $reflector->getProperty('engine'); 
$engineProperty->setAccessible(true); 

$maserati = new Car; 
echo $engineProperty->getValue($maserati); // echoes "V8" 
$engineProperty->setValue($maserati, 'I4'); 
echo $engineProperty->getValue($maserati); // echoes "I4" 

だから、明らかに、何のセキュリティ上の利点はありません。

利点は、クラスが相互作用するために設計された関数とプロパティをマークすることでエンドユーザーの役に立ちます。彼らが望むならば、開発者はクラスの内部を完全に変更することができますが、それを呼び出すコードは変更する必要はありません。彼らが本当にしたい場合は、クラスのユーザーはそれについてはうんざりすることができますが、それは動作しない場合、彼らの問題です!

+0

私はこれを考えていましたが、わかりません。私の先生は、私は、常にプライベート/保護された物件を作り、ゲッターとセッターだけを使って外部の範囲とやりとりし、公共の可視性を使わないようにしなければならないと言いました。私は正しい値が設定されることを保証します)。 –

+0

@BrunoCorrêaZimmermann私は公共の制限の概念全体には同意しません。あなたがこの人/会社のために働いていて、それが社内の基準であったならば、私はあなたがそれに固執しなければならないと言っていますが、一般的にこの方法を制限することは本当の利益のために限定しています「セキュリティ」の観点からではありません。 – Rasclatt

+0

ありがとう、あなたは私の疑問を解決しました –

2

これはセキュリティとは関係ありません。 カプセル化は、あなた/あなたの先生が探している単語かもしれません。

は、他の回答が指摘したようにWhat is encapsulation? How does it actually hide data?

+0

おそらく。しかし、getter/setterカプセル化は公開プロパティよりも安全ですか?正しい値だけが設定されていることを確認したとしても? –

+0

いいえ、いいソフトウェアクラス/パッケージは、他のコードモジュールから実際にアクセスする必要のある機能のみを公開します。 – einherjer

+0

私がリンクしている質問の受け入れられた答えを読む:)私はここに全体をコピー・ペーストするつもりはない。適切にカプセル化されたコードを書くことの主な利点を説明します。 * Security *は、このための正しい用語ではありません。 – ShiraNai7

0

継承は、カプセル化の影響を受ける別の領域です。

子クラスを持つ基本クラスを拡張することによって、新しい機能がアプリケーションに追加されることがよくあります。ソフトウェアプロジェクトで作業するために雇われた新しい開発者は、通常、他の開発者が作成したクラスのパブリックメソッドを使用します。

方法は、それが私の知る限りでは、将来の開発者

関連する問題