php - 哪种初始化 php 属性的方法更好?

标签 php class variable-initialization

这里有两种初始化类变量的方法。

第一种方法

class Test {
    private $var1;
    private $var2;

    public function Test($var1,$var1) {
        $this->var1 = $var1;
        $this->var2 = $var2;
    }
}
$objTest = new Test("value1","value2");

第二种方法

class Test {
    private $var1;
    private $var2;

    public function _set($var, $value) {
        $this->$$var = $value
    }
}
$objTest = new Test();
$objTest->_set('var1','value1');
$objTest->_set('var2','value2');

现在,这两种方法都有效,但我想知道哪种方法在什么条件下更好?只坚持一种方法的优缺点是什么?

最佳答案

在您的示例中,第二种方法风险很高。如果将变量名作为参数提供,基本上就是为代码提供了从类外部设置所有私有(private)变量的权限。如果允许像那样自由设置私有(private)变量,那么拥有私有(private)变量有什么意义?

此外,OOP 中的封装点是类的内部工作对类外部的代码不透明。你的第二个方法打破了这种封装,因此打破了 OOP 的一部分,因为类外部的代码必须知道类的内部工作,比如变量的名称。如果您稍后选择更改变量名称会怎样?所有的代码都中断了。如果通过 setter/getter 访问它们,则可以更改旧函数以反射(reflect)类内部的更改,但类外部的代码将很难更改。除此之外,第二种方法使值的验证变得困难。

您应该使用第一种方法,尤其是在操作需要设置类变量时。但是,如果您觉得属性可以允许一些默认值,您可以利用 PHP 的默认参数值,例如:

class Test {
    private $var1;
    private $var2;

    public function Test($var1 = 'defaultValue', $var1 = 'defaultValue') {
        $this->var1 = $var1;
        $this->var2 = $var2;
    }
}
$objTest = new Test();

无论如何,如果值必须由代码初始化,那么您绝对应该强制在构造函数中传递它们。如果允许默认值,则要么使用变量的单独 setter 初始化构造函数中的值,要么像提供的示例中那样仅使用默认参数值。但是,期望代码在调用构造函数后通过 setter 设置临界值是不好的做法。

关于php - 哪种初始化 php 属性的方法更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5322123/

相关文章:

html - CSS 不识别类

swift - 属性初始值设定项在 'self' 可用之前运行

Java 字符串初始化(第 2 部分)

c++ - 自动变量创建的顺序是否对应​​声明的顺序?

PHP 两次发送电子邮件但未正确上传图像 :/

php - 升级PHP系统中现有的数据库

c++ - 从其名称的字符串生成派生类实例。 (即反射)

javascript - 声明与初始化变量?

php - 使用 Symfony 5 配置 Mercure

PHP 帮助构建查询