2011-05-12 87 views
2

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

像:

class User { 

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

} 

回答

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

你不能在属性声明宣布他们,但你可以在构造__construct()array()可以在public $w被实例化,而不new关键字实例化它们:public $w = array();

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

谢谢,它会帮助很多=) – Gerep 2011-05-13 18:29:35

2

是的,这是。实例化过程中

  • class B { 
        public $b; 
    } 
    
    $my_object = new B(); 
    $my_object->b = (object)array(
        'property' => 'test', 
    ); 
    echo $my_object->b->property; // should also show 'test' 
    

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' 
  • 实例化之后,但是这是可以的类实例化过程中完成(构造函数)或更高版本,例如

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

  • 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; 
        } 
    } 
    

    第二个例子中它更为简洁和国际海事组织它使意图更加清晰。比较?: -operator与MySQL COALESCE

    +0

    谢谢,它会帮助很多=) – Gerep 2011-05-13 18:29:46

    +0

    很好的例子。很有帮助。谢谢。 – 2015-04-10 16:52:32