-5

可能重复:
不使用 setter 和 getter 真的有错吗?
为什么要使用 getter 和 setter?

我一直想知道为什么人们在 PHP 中使用 getter/setter 而不是使用公共属性?

从另一个问题,我复制了这段代码:

<?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;
  }
}
?>

我认为这与使用公共领域没有区别。

好吧,我知道它可以帮助我们验证 getter 和 setter 中的数据,但是上面的示例不适合它

4

2 回答 2

7

使用 getter 和 setter 是为了防止类之外的代码访问实现细节。也许今天一些数据只是一个字符串,但明天它是通过将其他两个字符串连接在一起并记录检索字符串的次数来创建的(好的,人为的例子)。

关键是通过强制访问你的类通过方法,你可以自由地改变你的类如何做事情而不影响其他代码。公共财产不给你保证。

另一方面,如果您只想保存数据,那么公共属性就可以了,但我认为这是一个特例。

于 2012-04-09T15:56:50.367 回答
1

With getters and setters you get the control over the properties of a class. Look like this example:

<?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

If you make the property protected, or private, this can't be done and you can have control over what is in the property.

于 2012-04-09T16:00:40.137 回答