4

我已经搜索了一段时间,但我找不到答案,这两种在 PHP 中初始化变量类的方法有什么区别?:(如果有的话)

class MyClass
{
    private $myVariable='something';

    public function __construct()
    {

    }
}

class MyClass
{
    private $myVariable;

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

4 回答 4

3
  • 如果要在类中使用默认值初始化变量请选择方法 1。
  • 如果要使用外部值初始化变量,请通过构造函数传递变量并选择方法 2。
于 2012-10-30T19:15:19.307 回答
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()属性,请在类定义中进行,以确保它们也存在于子类中。
  • 如果您的属性依赖于参数或者是可选的,请将它们放在构造函数中。

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

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

于 2012-10-30T19:29:08.540 回答
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

可能还有更多不同...

于 2012-10-30T19:13:42.810 回答
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;
    }
}
于 2012-10-30T19:19:53.743 回答