-5

重複の可能性:
セッターとゲッターを使用しないのは本当に間違っていますか?
なぜゲッターとセッターを使用するのですか?

なぜ人々はパブリックプロパティを使用する代わりにPHPでゲッター/セッターを使用するのかといつも疑問に思っていました。

別の質問から、私はこのコードをコピーしました:

<?php
class MyClass {
  private $firstField;
  private $secondField;

  public function __get($property) {
    if (property_exists($this, $property)) {
      return $this->$property;
    }
  }

  public function __set($property, $value) {
    if (property_exists($this, $property)) {
      $this->$property = $value;
    }

    return $this;
  }
}
?>

これとパブリックフィールドの使用に違いはありません。

ええと、ゲッターとセッターの両方でデータを検証するのに役立つかもしれないことは知っていますが、上記の例はそれに適合しません

4

2 に答える 2

7

ゲッターとセッターは、クラス外のコードが実装の詳細にアクセスするのを防ぐために使用されます。今日は一部のデータが単なる文字列である可能性がありますが、明日は他の2つの文字列を結合し、文字列が取得された回数をカウントして作成されます(OK、考案された例)。

重要なのは、クラスへのアクセスを強制的にメソッドを通過させることで、他のコードに影響を与えることなく、クラスの動作を自由に変更できるということです。公共施設はあなたにその保証を与えません。

反対に、データを保持するだけであれば、パブリックプロパティは問題ありませんが、それは特殊なケースだと思います。

于 2012-04-09T15:56:50.367 に答える
1

ゲッターとセッターを使用すると、クラスのプロパティを制御できます。この例のようになります。

<?php
class User
{
  public function $name;

  public function __construct($name)
  {
    $this->setName($name);
  }

  public function setName($name )
  {
    if (!preg_match('/^[A-Za-z0-9_\s]+$/')) {
      throw new UnexpectedValueException(sprintf('The name %s is not valid, a name should only contain letters, numbers, spaces and _', $name);
    }
    $this->name = $name;
  }
}
$foo = new User('Foo'); // valid
$foo->name = 'Foo$%^&$#'; // ahh, not valid, but because of the public property why can do this

プロパティprotected、またはを作成した場合private、これは実行できず、プロパティの内容を制御できます。

于 2012-04-09T16:00:40.137 に答える