【问题标题】:What's the sense of the __get() & __set() methods__get() 和 __set() 方法的意义是什么
【发布时间】:2016-04-11 07:19:39
【问题描述】:

今天我读了一篇关于 MVC 的教程,这个人正在使用魔法方法(__get 和 __set())来访问私有成员值。 (LINK) 首先我对 __get 和 __set 做了什么感到困惑,但是在阅读了互联网之后,我终于发现,如果无法从外部访问该成员,则会调用此方法。 到目前为止...

但是这样的代码没有意义:

类Foo {
    私人$酒吧;

    公共 __set($value) {
        $this->bar = $值;
    }

    公共 __get() {
        返回 $this->bar;
    }
}

我猜我可以使用普通的 getter 和 setter - 它的 IMO 更容易理解:

类Foo {
    私人$酒吧;

    公共设置栏($值){
        $this->bar = $值;
    }

    公共getBar(){
        返回 $this->bar;
    }
}

如果您想使用 __get 和 __set 访问外部成员,您也可以将成员设为公开 - 所以我不明白它的含义。 你能告诉我(也许有一个例子)这两种方法的意义是什么?

【问题讨论】:

  • 在您提供的链接中看不到您作为示例编写的任何内容。他使用的是数组,而不是单个属性$this->vars[$index] = $value;。因此使用__set 和__get 访问索引中的键的意义是相当合法的。或者你想为每个键写一个访问器?
  • 没错,但我在不同的教程中也看到过这种情况......而且您也可以使用普通的 getter 和 setter 来设置数组,不是吗?
  • 正如我所写,使用它们是合法的,我并没有说使用它们是明智的;)
  • 我知道它们可能是合法的,但我完全不明白 =) 无论如何感谢您的回答^^

标签: php oop getter-setter magic-methods member-access


【解决方案1】:

您开发了您的程序,并且您认为您不必控制对您的属性的访问。因此,您将 public 而不是 private 。但是在维护期间,您意识到您需要更改您的类以施加约束,从而禁止将属性设为 0。要进行此更改,您需要添加一个 setter 并私下使用您的属性。结果:您需要将此更改影响到所有此类客户。

如果您从一开始就使用 setter 和 getteurs,维护会简单得多。

【讨论】:

  • 所以它们只是为了使以后的更改更容易? - 但不要和他们一起构建你的程序
  • 面向对象的编程允许您指定类方法和属性的可见性。在属性的情况下,将它们公开是非常可取的,因为这样就可以在不对值进行监视的情况下更改它们。
  • 通过称为封装的 Getter 和 Setter 保护对其属性的访问。在面向对象编程中,封装是保护对象中的信息并仅提出操作该对象的方法的想法。因此,与对象中包含的信息相关的属性将由对象的方法提供/验证,并且不再是外部用户的责任。外部用户无法直接更改信息,存在危害对象行为属性的风险。
  • 当然,这是我的想法。我曾经使用 getter 和 setter 来访问成员。但我使用的是普通的 getter 和 setter,而不是那些神奇的 getter 和 setter。普通的 getter 和 setter 是有意义的,我知道它们的用途。
猜你喜欢
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 2013-07-17
  • 1970-01-01
  • 2012-04-05
相关资源
最近更新 更多