php,变量by ref或value

时间:2012-03-14 15:08:18

标签: php object pass-by-reference pass-by-value

我已经阅读this (References Explained)this stackoverflow(我说这是为了避免重复,并且在发布之前显示我已经搜索了很多)我仍然不明白如何实现一个非常简单的的事情。

这就是我想要做的事情:

  • 类产品
  • class Product

全部使用getter / setter。

我有一个页面,它将动态构建一系列产品,一个的产品,然后我将创建新产品,并将它们添加到该组:

<?php

$group_of_products = new Products();
$product1 = new Product();
$product1->setName("name1");
$product2 = new Product();
$product2->setName("name2");
$product3 = new Product();
$product3->setName("name3");

$group_of_products->addProduct($product1);
$group_of_products->addProduct($product2);
$group_of_products->addProduct($product3);

?>

现在这就是我想要的:

<?php

$group_of_products->getProduct( 0 )->setName("NewName1");
$group_of_products->getProduct( 1 )->setName("NewName2");
$group_of_products->getProduct( 2 )->setName("NewName3");

echo $product1->getName().", ";
echo $product2->getName().", ";
echo $product3->getName();

?>

我希望看到NewName1, NewName2, NewName3

如何声明类addProduct()的函数Products以获取此类行为?

2 个答案:

答案 0 :(得分:3)

您不应该通过引用传递内容。这是一个应该有效的例子:

class Products
{
    private $products, $count = 0;
    function getProduct( $i)
    {
        return isset( $this->products[$i]) ? $this->products[$i] : null;
    }

    function addProduct( $product)
    {
        $this->products[$this->count++] = $product;
    }
}

答案 1 :(得分:1)

您无需关注此处的引用或值(请参阅Objects and referencesDocs),因此您可以将Products设为ArrayObject(或者可能是SplObjectStorage ):

class Products extends ArrayObject
{
    public function __construct() {
        parent::__construct(array());
    }
    public function addProduct(Product $product) {
        $this[] = $product;
    }
    /**
     * @param $index
     * @return Product
     * @throws InvalidArgumentException
     */
    public function getProduct($index) {
        if ($this->offsetExists($index) && $this[$index] instanceof Product) {
            return $this[$index];
        }
        throw new InvalidArgumentException('No Product at index %s.', $index);
    }
}

用法:

$group_of_products = new Products();
$product1 = new Product();
$product1->setName("name1");
$product2 = new Product();
$product2->setName("name2");
$product3 = new Product();
$product3->setName("name3");

$group_of_products->addProduct($product1);
$group_of_products->addProduct($product2);
$group_of_products->addProduct($product3);

$group_of_products->getProduct( 0 )->setName("NewName1");
$group_of_products->getProduct( 1 )->setName("NewName2");
$group_of_products->getProduct( 2 )->setName("NewName3");

echo $product1->getName().", ";
echo $product2->getName().", ";
echo $product3->getName();

输出:

NewName1, NewName2, NewName3

如果你使用上面的ArrayObject变种,你也可以这样做:

$group_of_products[] = $product1;
$group_of_products[0]->setName("NewName1");

什么适合你。

参见/相关:Array of objects within class in PHP