另一个类的PHP属性

时间:2014-04-17 08:55:36

标签: php

我不是百分百肯定,但这是定义属性的正确方法:

class Product {
    public $id;
    public $name;
}

class LineItem {
    public Product $product; //<------ this property
    public $qty;
}

或者,最好将其保留为$product而没有类型标识符?

5 个答案:

答案 0 :(得分:3)

产品应以这种方式定义:

public $product;

并将其创建为:

$product = new Product();

答案 1 :(得分:2)

正如@Jon在评论中已经建议的那样。 PHP实际上并不支持类型标识符。对此最好的方法(或者至少就像我做的那样)。只需定义$product然后创建构造函数,该构造函数在该类变量中实例化一个新的Product对象。或者只是在需要时使用LineItem类中的getter / setter方法传入对象。

编辑:确实与情况有所不同(你没有给出情况,所以我试着猜测并给出一个例子)。

构造

public function __construct($product = new Product()) {
    $this->product = $product;
}

Getter / setter以同样的方式工作:

public function getProduct() {

    return $this->product;
}

//In arguments you're able to make sure it is of a class Product if I'm correct.
public function setProduct(Product $product) {

    $this->product = $product;

    //You might do a return of $this, dependent on your logic of course.
    return $this;
}

编辑:为可能从中受益的未来用户添加以下代码。 在常规PHP文件中,您可以执行以下操作:

$product = new Product();
//Set some price, description or something in your product...

//Pass product with constructor.
$lineItem = new LineItem($product);

//Get the product of the lineItem...
$product = $lineItem->getProduct();

//Set a product if constructor hasn't been used...
$lineItem->setProduct($product);

答案 2 :(得分:1)

正如乔恩所说,你不能在PHP中拥有类型标识符。

可以执行类似的操作并使用instanceof运算符:

class LineItem {
      protected $_product;
      //...

      public function setProduct($p) {
          if($p instanceof Product) {
              $this->_product = $p;
          } else {
              throw new Exception("...");
          }
      }
}

答案 3 :(得分:1)

您可以在__construct()上使用Type Hinting

class Product {
    public $id;
    public $name;
}

class LineItem {
    public function __construct(Product $product) {
        $this->product = $product;
    }
    public $qty;
}

答案 4 :(得分:0)

您可以在构造函数中设置它

class Product {
    public $id;
    public $name;
}

class LineItem {
    public $product; 
    public $qty;

    function __construct(){
        $this->product = new Product();
    }  
}