在__construct中直接设置属性是不好的做法吗?

时间:2013-12-13 19:45:49

标签: php oop

直接在__construct设置属性是不好的做法。这些代码块之一是面向对象PHP的更好的实践吗?

我知道在课堂外这样做是不好的做法......

class person {
    protected $name;

    function __construct($persons_name) {
        $this->set_name($persons_name);
    }
    function set_name($new_name){
        $this->name = $new_name;
    }
}

VS

class person {
    protected $name;

    function __construct($persons_name) {
        $this->name = $persons_name;
    }
    function set_name($new_name){
        $this->name = $new_name;
    }
}

4 个答案:

答案 0 :(得分:1)

这不被视为不良做法;它实际上只取决于set_name($name)实际上在做什么。

如果您只是直接从参数设置变量的值(例如在您的问题中),那么附加函数调用会产生性能成本。然而,这将是一个非常小的。

如果您在设置之前编辑/修改参数,那么最好将函数封装在方法中以避免代码重复。

答案 1 :(得分:1)

这两个陈述基本上都没问题。您应该注意一些小差异:

  • 方法set_name()可以覆盖。这意味着扩展该方法的函数可以改变它的行为。这既不好也不坏,你应该考虑一下你是否希望你的应用程序这样做。

  • 正如hek2mgl所述,您还可以使用该方法执行其他任务来验证构造函数生成的数据,并避免重复代码。

  • 第二是表现。虽然您永远不应该将性能作为优先级进行编码(首先始终是干净且可读的代码),但使用方法确实会使您的服务器花费几个CPU周期,这在其他地方可能会有用。

如果您希望您的应用程序使用set_name()方法并使其“可以防止覆盖”,则可以使用final关键字。

答案 2 :(得分:0)

虽然在这个例子中没有区别,但第二个是“更好”。这是因为通常你会在setter方法中包含一些验证检查或类似的东西。因此,您可以在直接设置属性时绕过它们。

在考虑OOP设计时,另一个重要点是,如果您正在调用setter,那么您可以提供子类来更改该过程而无需覆盖整个构造函数的可能性

答案 3 :(得分:0)

我认为,这主要归结为个人偏好。但是,有些值无法直接设置到变量,例如必须在构造函数中指定的新类实例。