是否可以将类的属性设置为对象?
喜欢:
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'
不能在构造函数或其他方法之外的类定义中直接分配对象,因为您只能使用标量(例如整数、字符串等)来分配对象。