PHP 属性作为对象


PHP property as object

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

喜欢:

class User {
    public $x = "";
    public $y = new ErrorVO();
    public $w = new array();
}

在构造函数中,是的。

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());

只是我的首选解决方案,即使其他人已经解释了一切: 注射

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

不能在属性声明中声明它们,但可以在构造函数中实例化它们 __construct() 可以在没有 new 关键字的情况下在public $w中实例化array()public $w = array();

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

是的。但这可以在类实例化(在构造函数中)或以后完成,例如:

  • 在实例化期间:

    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'
    

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