2010-07-09 142 views
33

我不知道是否有VSPHP初始化变量在__construct()对声明

class TestClass { 
    private $_var; 
    function __construct() { 
     $this->_var = "abc"; 
    } 
} 

我不知道是否是后者的优选方式/更好的做法

class TestClass { 
    private $_var = "abc"; 
} 

之间的任何差异?有没有功能差异?

+0

fwiw - actionscript警告初始化类的声明中的对象。所以虽然'private $ _var =“abc”'可能是可以接受的,private private _var = new SpecializedClass();'不会是 – 2010-07-09 03:49:16

+0

即使很多开发人员也可能会混淆这个。使用构造函数进行动态初始化。这是一个类似的线程http://stackoverflow.com/questions/7088585/initializing-class-member-variables-with-expressions-concatenated-string-in-ph – kta 2013-10-22 01:51:56

回答

22

它们实际上是一样的。我更喜欢前者,因为那时只有一个地方可以查找价值及其默认值。另一方面,如果你需要对它做一些动态的处理,或者将它设置为除数组或基元以外的其他任何东西,则需要使用第二种形式。值得注意的是,您不能使用函数调用以第一种形式声明变量。

+1

嗯,我想解释它,第一种方法只能用于简单实例化,第二个是如果需要复杂处理,例如。函数调用或if/else等 – 2010-07-09 04:08:31

+0

我认为另一个更好的理由更喜欢前者,即使扩展类并覆盖构造函数,默认值仍将保留。 – Adam 2017-11-28 21:02:21

3

优秀的问题!我觉得第一个例子更加正确,如果你已经知道对象属性的初始值,为什么要在构造函数中声明它?

我觉得构造函数的目的是设置可能是可变的属性。

如果有的话,它看起来像一个可读性的东西。我不知道任何一种方法的性能问题。

1

我不知道你的例子有什么不同,它们看起来都表现得一样。如果两者都执行,构造函数代码将覆盖声明部分中完成的初始化。我个人来自C++背景,在静态类型语言中,所有声明都发生在类的主体内部,但在任何函数之外,并且所有的初始化和其他类的准备都发生在构造函数内部。

当你的第一个例子完成初始化,并且有一些代码在构造函数中做某些事情时,对我来说它看起来像混合编码范例,所以即使它更冗长,我倾向于选择第二个例子我自己的代码风格。