PHP:访问属性的优点/缺点
在我看来,有三种方法可以访问PHP中的对象属性: 1。神奇的方法PHP:访问属性的优点/缺点,php,oop,methods,getter-setter,magic-methods,Php,Oop,Methods,Getter Setter,Magic Methods,在我看来,有三种方法可以访问PHP中的对象属性: 1。神奇的方法 public function __get($property) { if (property_exists($this, $property)) { return $this->$property; } } public function __set($property, $value) { if (property_exists($this, $property)) { $th
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;
}
}
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
2。天真的能手和二传手
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;
}
}
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
3。直接
// Set name
$dog->name = "rover";
// Get name
$name = $dog->name;
我的问题是什么时候应该使用/避免这些方法?(即,每种方法的优缺点是什么?)
纯粹就速度而言,我做了一些评测,三者之间的性能差异很大。在我的机器上,平均有一百万次访问:
神奇方法速度0.58秒 天真的接受者和接受者速度
0.13秒 直接访问速度
0.05秒 链接: 这似乎表明,除非必要,否则应该避免使用神奇的方法,对于天真的getter和setter也是如此,但是(当然)在我的机器上,每百万次访问只需要几分之一秒,正如俗话所说,“过早优化是万恶之源” 所以也许速度不应该是决定性因素 显然,您可能希望对属性进行验证,因此我可以看到朴素的getter和setter在这方面是多么有用 那么什么时候应该使用这些方法呢?他们最适合什么情况 我意识到这可能因为主要是基于观点而被关闭,但我正在抓住一个机会,一些好的答案,有逻辑和数据支持,可能会被生成:)让我们看看 在我的实践中,我使用(2):私有变量+getter/setter 根据坚实的意识形态,应避免直接访问(3) 神奇方法(1):我建议可以使用它(IMHO),但在15年以上的编程实践中,我只记得我需要它的一次。即使是这样,也需要验证。在我的实践中,我使用(2):私有变量+getter/setter 根据坚实的意识形态,应避免直接访问(3)
神奇方法(1):我建议可以使用它(IMHO),但在15年以上的编程实践中,我只记得我需要它的一次。即使是这样,也需要进行验证。Naive getter和setter在我看来更好,因为您可以使用它们做更多的事情,而不只是在需要时设置/获取值。Direct将阻止您这样做,如果您需要将自定义逻辑添加到setter或getter,那么magic函数将是一个非常混乱的代码。如果您想要编写OOP代码,您应该完全避免这些概念。让构造函数初始化所有对象属性。其中一些带有参数,另一些带有默认值。检查使用getter的代码并将其移动到类本身中。问题中描述的形式的getter和setter只是伪装成OOP的过程编程。@axiac有争议!:)Mutator方法属于封装,不是吗?您还应该问问自己是否真的需要getter和setter?在您的快速示例中,我看不出您需要它们的原因。我经常使用直接访问,因为我不使用getter/setter。在我看来,可能重复使用Naive getter和setter更好,因为您可以使用它们做更多的事情,而不只是在需要时设置/获取值。Direct将阻止您这样做,如果您需要将自定义逻辑添加到setter或getter,那么magic函数将是一个非常混乱的代码。如果您想要编写OOP代码,您应该完全避免这些概念。让构造函数初始化所有对象属性。其中一些带有参数,另一些带有默认值。检查使用getter的代码并将其移动到类本身中。问题中描述的形式的getter和setter只是伪装成OOP的过程编程。@axiac有争议!:)Mutator方法属于封装,不是吗?您还应该问问自己是否真的需要getter和setter?在您的快速示例中,我看不出您需要它们的原因。我经常使用直接访问,因为我不使用getter/setter