初始化php属性的更好方法是什么?

初始化php属性的更好方法是什么?,php,class,variable-initialization,Php,Class,Variable Initialization,这里有两种初始化类变量的方法 第一种方法 第二种方法 现在,这两种方法都是有效的,但我想知道哪一种在什么条件下更好?只使用一种方法的优缺点是什么?如果这些变量对于类的操作是必需的,您最好使用第一种方法。这样,您可以确保在创建类时设置它们。我的想法是,您应该将这两种方法结合起来 构造方法中必须存在不可避免的属性 对于可选属性,应该在构造中定义默认值,然后创建getter/setter 您可以创建多个构造方法,如数据库,一般来说,您有: myConstructor($dsn) myConstruct

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

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

如果这些变量对于类的操作是必需的,您最好使用第一种方法。这样,您可以确保在创建类时设置它们。

我的想法是,您应该将这两种方法结合起来

构造方法中必须存在不可避免的属性

对于可选属性,应该在构造中定义默认值,然后创建getter/setter

您可以创建多个构造方法,如数据库,一般来说,您有:

myConstructor($dsn)
myConstructor($dsn, $username, $password)
myConstructor($dsn, $username, $password, $port)
myConstructor($dsn, $username, $password, $port, $options)

然后在“底部”构造中,您将设置
$options
,然后调用将设置
$port
的“上部”构造,并将调用“上部”构造。。。等等

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

此外,OOP中的封装要点是类的内部工作对类外的代码不透明。您的第二个方法打破了这种封装,从而成为OOP的一部分,因为类外部的代码必须知道类的内部工作,比如变量的名称。如果以后选择更改变量名,会发生什么情况?所有的密码都被破解了。如果通过setter/getter访问旧函数,则可以更改旧函数以反映类内的更改,但类外的代码将很难更改。除此之外,第二种方法使值的验证变得困难

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

class Test {
    private $var1;
    private $var2;

    public function Test($var1 = 'defaultValue', $var1 = 'defaultValue') {
        $this->var1 = $var1;
        $this->var2 = $var2;
    }
}
$objTest = new Test();
无论如何,如果值必须由代码初始化,那么您肯定应该强制在构造函数中传递它们。如果允许使用默认值,则可以使用单独的变量设置器初始化构造函数中的值,或者只使用提供的示例中的默认参数值。然而,在调用构造函数之后,期望代码通过setter设置临界值是一种不好的做法。

这是怎么回事

class A{

    public $x;
    public $y;
    function A($var1=10,$var2=15){   //the default value for the class
        $this->x=$var1;  
        $this->y=$var2;

    }
}

$object_of_A= new A(20,30);  //if you do not want to change the default value then
                               //pass no arguments

我想知道为什么您首先将变量定义为private。私有成员是为类本身而存在,而不是通过公共接口使用。它可能会跟踪某些值,在程序中的任何时候,magic setter方法(_set)都可以更改这些值,就像您在第二个示例中看到的那样。如果您需要将变量设置为私有(仅用于类访问),则需要一个构造函数uu构造($var1,$var2)或u构造($var1=“defaultvalue”,$var2=“defaultvalue”),以便与第一个示例保持一致

这取决于您在状态/活动图中计划的预期状态


希望这有帮助

你似乎还没有掌握构造函数的概念。@maria,是的,有点像这样@BoltClock,我非常了解构造函数的概念,但我正在询问类变量初始化和它们的方法。顺便说一句,术语:在OOP中,a是类的
静态
成员;“类变量”只有一个值,由该类的所有实例共享。您正在展示的是,在php中称为properties.FWIW,而其他语言支持多分派,而php不支持。但是,它确实支持函数调用的默认值,这通常效果很好。(这个问题被标记为PHP。)@Starx-不幸的是,他展示的代码在PHP中是不允许的-一旦看到第二个同名的代码,编译错误就会出现。因此,最好使用构造函数设置不可避免的类变量?是的,这就是构造函数的用途。要构造类的一个对象来完成它的任务,需要注意的一点是,即使我使用第1个方法,我也可以根据自己的喜好设置私有变量,这次它只限于几个数字。使用第二种方法,如果我设置了任何新变量,那么它们将是公共的而不是私有的。OOP中的封装点是,类的内部工作对类外的代码是不透明的。您的第二个方法打破了这种封装,从而成为OOP的一部分,因为类外部的代码必须知道类的内部工作,比如变量的名称。如果以后选择更改变量名,会发生什么情况?所有的密码都被破解了。如果通过setter/getter访问旧函数,则可以更改旧函数以反映类内的更改,但类外的代码很难更改。你的第二种方法也使验证变得困难。这确实是一个很好的观点。我认为您应该在答案中包含这一点。将其添加到实际答案中。不,
$x=$var1
,不会将该值分配给
公共$x
。当你纠正它时,它将类似于@Rinuwise的回答。这个代码是有效的@Starx-您误解了属性(此处,
$x
$y
)在类中的工作方式。您考虑的问题是函数中的
global$x
。不一样。@ToolmakerSteve,代码后来被编辑并更正了。:)我同意你的观点,除了在创建数据库模型类的情况下,成员变量通常是受保护的或私有的,并且通过公共接口访问。这显然是许多案例中的一个。
class Test {
    private $var1;
    private $var2;

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

    public $x;
    public $y;
    function A($var1=10,$var2=15){   //the default value for the class
        $this->x=$var1;  
        $this->y=$var2;

    }
}

$object_of_A= new A(20,30);  //if you do not want to change the default value then
                               //pass no arguments