【问题标题】:Use a Class instance as an property of Another Class使用 Class 实例作为另一个 Class 的属性
【发布时间】:2015-02-16 09:07:49
【问题描述】:

我想用另一个类的实例作为属性创建一个类。像这样的:

class person
{
    var $name;
    var $address;
}

class business
{
    var $owner = new person();
    var $type;
}

这当然行不通,我已经尝试了一些变体。我在 Google 搜索中找到的所有内容都只引用了嵌套类定义 (class a { class b{ } })。

是否可以将一个类实例放在另一个类中?如果没有,是否有合理的解决方法?

【问题讨论】:

  • 您实例化您的person 类并将其设置为business 类构造函数中的owner 属性值
  • 但是停止使用var 并使用正确的visibility 关键字......你不是还在使用PHP4吗?
  • 我和马克贝克在这里,解释为什么你不能使用例如 business::__construct() 来设置 $owner 属性?是在构造中创建 person 的实例还是将其作为参数传递给构造函数?
  • @qrazi - 没有特别的原因。我非常擅长程序 PHP 和客观目标 C#。这是我第一次尝试用 PHP 进行目标编程。所以我正在弄清楚我的局限性是什么。我可能会结合使用提到的所有内容以及 get_class() 函数来禁止尝试将 $owner 字段设置为错误的类型。
  • @Andrew 我认为你不需要 get_class()。如果你在构造函数中实例化,你就知道它是什么类。如果你把它作为一个参数,就像这样的答案,那么输入这个参数是有意义的。

标签: php class


【解决方案1】:
class person
{
    public $name;
    public $address;
}

class business
{
    public $owner;
    public $type;

    public function __construct()
    {
        $this->owner = new person();
    }
}

【讨论】:

    【解决方案2】:

    您不能将类初始化为属性/属性/字段声明的一部分。

    From the PHP Property documentation:

    [Property] 声明可以包含一个初始化,但是这个初始化必须是一个常量值——也就是说,它必须能够在编译时被评估,并且不能依赖于运行时信息才能被评估。

    如果需要新实例有一个包含类实例的属性,则需要在构造函数中赋值:

    class business {
        public $owner;
    
        public function __construct() {
            $this->owner = new person();
        }
    }
    

    顺便说一句,请务必使用 visibility 关键字(public、protected、private)而不是 var。

    【讨论】:

      【解决方案3】:

      如果您打算调用其他类方法,可以尝试这样使用:

      class person
      {
          public $name;
          public $address;
      }
      
      class business {
       public $owner;
          function __construct( $obj ) {
              $this->owner = $obj;
          }
      
      }   
      $a = new person();
      $b = new business($a);
      

      【讨论】:

      • 这可能是最好的答案。我可能会使用类似的东西。我最大的担忧是只允许属性 $a 中的 person 类。我可能会使用 get_class() 函数来测试传递给构造函数的变量的有效性。谢谢!
      • @Andrew 或使用类型提示:function __construct(person $obj) 参见php.net/manual/en/language.oop5.typehinting.php
      猜你喜欢
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      相关资源
      最近更新 更多