是否可以将类的属性设置为对象?
像:
class User {
public $x = "";
public $y = new ErrorVO();
public $w = new array();
}
答案 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'
您不能在构造函数或其他方法之外的类定义中直接分配对象,因为您只能使用标量(例如整数,字符串等)来执行此操作。