まず第一に、強力な OO クラスを開発するときは、クラスの内部セマンティクスをできるだけ公開しないようにする必要があります (明らかに機能に影響を与えずに)。
一部の変数は、クラス自体のコンテキスト内でのみ価値があり、クラスを使用する開発者には意味がありません。変数を public にすることで、クラスを使用する誰もがそのような変数を自由に変更できるようになります。PHP では、少なくとも起こり得る損害を軽減するタイプ セーフさえない場合に、これは特定の問題になる可能性があります。
これを考慮してください: いくつかの I/O 操作をラップするクラスがあります。呼びましょうFileReader
class FileReader {
public $_handle;
public function __construct($filepath) {
$this->_handle = fopen($filepath, 'r');
if ($this->_handle === NULL) {
throw new Exception("Unable to open the file for reading");
}
}
// ... the rest of the class
}
これで、クラスがファイルへのハンドルを開くことがわかります。$_handle
変数をパブリックにすることで、クラスで作業しているすべての人に変数を公開しました。彼らは、あなたが開いている未加工のファイル ハンドルについて知る必要はありません。彼らは、あなたのナイス クラスを使用して読み取り操作を実行したいだけです。ただし、公開されています。見るだけでなく、変更することもできます。これは、特に他のコードが$_handle
変数が有効であると想定している場合には、悪いことです。
$reader = new FileReader();
$reader->_handle = "I hope this doesn't break anything. /trololol";
$reader->someOperation(); // oh no! Our file handle has just been changed to something completely wrong, this is now going to the break the class.
このようなばかげたシナリオは、最初に変数を非公開にすることで完全に回避できます。各アクセス修飾子が何をするか、およびそれらをいつ適用するかのより多くの (そしてより良い) 例については、この回答を参照してください。
次に、ゲッターとセッターについて説明します。あなたの質問では、すべてのゲッターとセッターが次のように書かれていると想定しているようです:
class Foo {
private $_bar;
public function getBar() {
return $this->_bar;
}
public function setBar($newBar) {
$this->_bar = $newBar
}
}
$_bar
その場合、最初に変数をパブリックに変更することと、それとの間に違いはありません。
ただし、ゲッター メソッドとセッター メソッドを使用すると、変数が外部開発者によってどのように設定されているかを制御できるため、いつブーブーを作成するかを即座に検出し、後で未定義の動作を回避できます。例えば:
class Foo {
private $_bar;
public function getBar() {
return $this->_bar;
}
public function setBar($newBar) {
// Now we're going to ensure that $newBar is always an integer
if (!is_int($newBar)) {
// not an integer, throw out an exception to let the developer know that somewhere is setting invalid input
throw new Exception("Expected an integer value for 'Bar'");
}
$this->_bar = $newBar;
}
}
これにより、クラスがはるかに堅牢になるだけでなく、クラスを使用する開発者の作業が非常に簡単になります。クラスが の破損した値を使用しようとしたときに、後でどこかで非常に奇妙な問題をデバッグするのではなく、破損し$_bar
た値がどこから設定されたかをスタック トレースから簡単に判断し、ソースで修正することができます。
変数アクセスとゲッター/セッター メソッドに関するドキュメントはたくさんあります。これはさまざまな言語に適用されます。C++/C#/VB.NET に基づいた記事を参照することを恐れないでください。同じ資料に変換します。