【问题标题】:php, variables by ref or by valuephp,按引用或按值的变量
【发布时间】:2012-03-31 01:37:58
【问题描述】:

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

这是我想做的:

  • 类产品
  • 类产品

全部带有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

我应该如何声明Products类的函数addProduct()以获得这样的行为?

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • @Brad:我误读了这个问题,但现在添加了一个更正的答案;)
    【解决方案2】:

    您不需要通过引用传递事物。这是一个应该有效的示例:

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

    【讨论】:

    • 对此我不确定。为什么$count?您不能只初始化数组并改为执行$this-&gt;products[] 吗?
    猜你喜欢
    • 2010-09-05
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多