PHP属性作为对象

时间:2011-05-12 20:55:56

标签: php object properties types

是否可以将类的属性设置为对象?

像:

class User {

    public $x = "";
    public $y = new ErrorVO();
    public $w = new array();

}

4 个答案:

答案 0 :(得分:6)

在构造函数中,是的。

class User
{
    public $x = "";
    public $y = null;
    public $w = array();

    public function __construct()
    {
        $this->y = new ErrorVO();
    }
}

修改

KingCrunch提出了一个很好的观点:您不应该对依赖项进行硬编码。您应该将它们注入对象(控制反转(IoC))。

class User
{
    public $x = "";
    public $y = null;
    public $w = array();

    public function __construct(ErrorVO $y)
    {
        $this->y = $y;
    }
}

new User(new ErrorVD());

答案 1 :(得分:6)

这是我首选的解决方案,即使其他人已经解释了所有内容:注射

class A {
  public $a;
  public function __construct (ErrorVO $a) {
    $this->a = $a;
  }
}

这使得类可以测试并允许非常容易地替换所需的ErrorVO - 实现。当然,您可以将两种解决方案合并为一个

class A {
  public $a;
  public function __construct (ErrorVO $a = null) {
    $this->a = is_null($a) ? new ErrorVO : $a;
  }
}

次要更新:在此期间,您可以像这样编写第二个示例

class A {
  public $a;
  public function __construct (ErrorVO $a = null) {
    $this->a = $a ?: new ErrorVO;
  }
}

它稍微紧凑一点,它使意图更清晰。将?: - 运算符与MySQL COALESCE

进行比较

答案 2 :(得分:2)

您不能在属性声明中声明它们,但您可以在构造函数__construct()中实例化它们array()可以在public $w中实例化而不使用new关键字: public $w = array();

public function __construct()
{
  $this->y = new ErrorVO();
}

答案 3 :(得分:2)

是的,确实如此。但这可以在类实例化(在构造函数中)或更高版本中完成,例如:

    实例化期间
  • class A {
        public $a;
        public function __construct() {
            $this->$a = (object)array(
                'property' => 'test',
            );
        }
    }
    
    $my_object = new A();
    echo $my_object->a->property; // should show 'test'
    
  • 实例化后
  • class B {
        public $b;
    }
    
    $my_object = new B();
    $my_object->b = (object)array(
        'property' => 'test',
    );
    echo $my_object->b->property; // should also show 'test'
    

您不能在构造函数或其他方法之外的类定义中直接分配对象,因为您只能使用标量(例如整数,字符串等)来执行此操作。