Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:访问属性的优点/缺点_Php_Oop_Methods_Getter Setter_Magic Methods - Fatal编程技术网

PHP:访问属性的优点/缺点

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

在我看来,有三种方法可以访问PHP中的对象属性:

1。神奇的方法

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