【发布时间】:2011-08-24 11:17:24
【问题描述】:
是否可以将类的属性设置为对象?
喜欢:
class User {
public $x = "";
public $y = new ErrorVO();
public $w = new array();
}
【问题讨论】:
标签: php object properties types
是否可以将类的属性设置为对象?
喜欢:
class User {
public $x = "";
public $y = new ErrorVO();
public $w = new array();
}
【问题讨论】:
标签: php object properties types
只是我喜欢的解决方案,即使其他人已经解释了一切:注入
class A {
public $a;
public function __construct (ErrorVO $a) {
$this->a = $a;
}
}
这使类保持可测试性,并允许替换想要的ErrorVO-implementation 非常容易。当然,您可以将两种解决方案合二为一
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;
}
}
它稍微紧凑一些,而且它使意图更加清晰。比较 ?:-operator 和 MySQLs COALESCE
【讨论】:
在构造函数中,是的。
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() {
$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'
您不能在构造函数或其他方法之外的类定义中直接分配对象,因为您只能使用标量(例如整数、字符串等)来分配对象。
【讨论】:
你不能在属性声明中声明它们,但是你可以在构造函数__construct()中实例化它们array()可以在没有new关键字的public $w中实例化:public $w = array();
public function __construct()
{
$this->y = new ErrorVO();
}
【讨论】: