【问题标题】:PHP property as objectPHP 属性作为对象
【发布时间】:2011-08-24 11:17:24
【问题描述】:

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

喜欢:

class User {

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

}

【问题讨论】:

    标签: php object properties types


    【解决方案1】:

    只是我喜欢的解决方案,即使其他人已经解释了一切:注入

    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

    【讨论】:

    • 谢谢,这会很有帮助 =)
    • 很好的例子。非常有帮助。谢谢。
    【解决方案2】:

    在构造函数中,是的。

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

    【讨论】:

      【解决方案3】:

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

      • 在实例化期间:

        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'
        

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 谢谢,这会很有帮助 =)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-05
        • 2015-12-23
        • 1970-01-01
        相关资源
        最近更新 更多