更好地初始化类变量的方法

时间:2012-10-30 19:09:57

标签: php class initialization

我一直在寻找一段时间,但我找不到答案,这两种在PHP中使用变量类的方式有什么区别?:(如果有的话)

class MyClass
{
    private $myVariable='something';

    public function __construct()
    {

    }
}

class MyClass
{
    private $myVariable;

    public function __construct()
    {
        $this->myVariable='something';
    }
}

4 个答案:

答案 0 :(得分:3)

  • 如果要使用默认值类中初始化变量,请选择方法1.
  • 如果要使用 outside 值初始化变量,请通过构造函数传递变量并选择方法2.

答案 1 :(得分:2)

查看此方案

class Parent {
    protected $property1; // Not set
    protected $property2 = '2'; // Set to 2
    public function __construct(){
        $this->property1 = '1'; // Set to 1
    }
} // class Parent;

class Child extends Parent {
    public function __construct(){
        // Child CHOOSES to call parent constructor
        parent::__construct(); // optional call (what if skipped)
        // but if he does not, ->property1 remains unset!
    }
} // class Child;

这是两个电话之间的区别。 parent :: __ construct()对于从父级继承的子类是可选的。所以:

  • 如果您需要预设标量(如is_scalar()属性,请在类定义中执行此操作确保它们也存在于子类中。
  • 如果属性依赖于参数或是可选的,请将它们放在构造函数中。

这完全取决于您如何设计代码的功能。

这里没有错,这只适合你。

答案 2 :(得分:1)

如果不选择在构造函数中初始化变量,则只能使用常量值。这是一个小例子:

define('MY_CONSTANT', 'value');

class MyClass
{ 
    // these will work
    private $myVariable = 'constant value';
    private $constant = MY_CONSTANT;
    private $array = Array('value1', 'value2');

    // the following won't work
    private $myOtherVariable = new stdClass();
    private $number = 1 + 2;
    private $static_method = self::someStaticMethod();

    public function __construct($param1 = '')
    {
        $this->myVariable = $param1;

        // in here you're not limited
        $this->myOtherVariable = new stdClass();
        $this->number = 1 + 2;
        $this->static_method = self::someStaticMethod();
    }
}

请查看本手册页,了解哪些值可以直接与属性相关联:http://php.net/manual/en/language.oop5.properties.php

可能会有更多差异......

答案 3 :(得分:1)

我喜欢这样做有点像第二种方式来促进延迟加载。声明成员变量时我将设置的简单值。

class WidgetCategory
{
    /** @var array */
    private $items;

    /**
     *
     * @return array
     */
    public function getItems()
    {
        if (is_null($this->items)) {
            $this->items = array();
            /* build item array */
        }
        return $this->items;
    }
}