php, переменные по ref или по значению - PullRequest
2 голосов
/ 14 марта 2012

Я прочитал это (ссылки объяснены) , этот стекопоток (я говорю это, чтобы избежать дубликатов и показать, что я много гуглил перед публикацией), и я все ещене понимаю, как реализовать очень простую вещь.

Вот что я хочу сделать:

  • класс Продукты
  • класс Продукт

Все с 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 ]

3 голосов
/ 14 марта 2012

Вам не нужно передавать вещи по ссылке. Вот пример, который должен работать:

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 голос
/ 14 марта 2012

Вам не нужно заботиться о ссылках или значениях здесь (см. Объекты и ссылки Документы ), так что вы можете просто сделать ProductsArrayObject (или, возможно, 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");

Все, что вам подходит.

Смотрите также / Похожие: Массив объектов в классе в PHP .

...