Как передать объекты в массив через методы получения / установки через другой класс в PHP OOP? - PullRequest
0 голосов
/ 03 марта 2020

Я не понимаю, как передать объекты InvoiceItem, созданные в классе ProcessInvoice, обратно в мой массив для вывода на страницу.

См. Вывод внизу сообщения. Он должен вывести все 3 элемента в массиве и общую сумму счета-фактуры.

Я неправильно использовал ключевое слово $this ?? Как передать объекты обратно в массив invoiceItems в классе Invoice?

    class InvoiceItem {
        private $id;
        private $itemQuanity;
        private $itemPrice;
        private $itemDescrip;

        // Getters and Setter here for above 4 attributes

        public function calculateItemTotal() {
            $total = $this->itemPrice * $this->itemQuanity;
            return $total;
        }

        public function display() {
            echo "Item ID: $this->id // Item Quanity: $this->itemQuanity // Item Price: $this->itemPrice // Item Description: $this->itemDescrip // Total: $$this->total<br>";
        }
    }
    class Invoice {
        private $invoiceItems;

        public function __construct() {
            $item = new InvoiceItem();
            $this->invoiceItems = array($item);
        }

        public function getInvoiceItems()
        {
                return $this->invoiceItems;
        }

        public function setInvoiceItems($invoiceItems)
        {
                $this->invoiceItems = $invoiceItems;

                return $this;
        }

        public function calculateInvoice() {
            foreach ($this->invoiceItems as $item_y) {
                $invoiceTotal = $invoiceTotal += $item_y->calculateItemTotal();
            }
            echo "Invoice Total: $$invoiceTotal ";
        }

        public function displayInvoice() {
            foreach ($this->invoiceItems as $item_x) {
                $item_x->display();
            }
            return $this->calculateInvoice();
        }

    }
    class ProcessInvoice {
        private $invoice;

        public function __construct() {
            $this->invoice = new Invoice();
        }

        public function getInvoice()
        {
                return $this->invoice;
        }

        public function setInvoice($invoice)
        {
                $this->invoice = $invoice;

                return $this;
        }

        function createInvoiceItems() {
            $item1 = new InvoiceItem();
            $item1->setId(1);
            $item1->setItemPrice(1.66);
            $item1->setItemQuanity(2);
            $item1->setItemDescrip("item example");

            $item2 = new InvoiceItem();
            $item2->setId(2);
            $item2->setItemPrice(34.99);
            $item2->setItemQuanity(1);
            $item2->setItemDescrip("bla bla");

            $item3 = new InvoiceItem();
            $item3->setId(3);
            $item3->setItemPrice(2.24);
            $item3->setItemQuanity(1);
            $item3->setItemDescrip("Another item");

            // SOMETHING WRONG HERE?!
            $this->invoice->setInvoiceItems($item1, $item2, $item3); 
        }

        function runProcess() {
            $invoice_x = new Invoice();
            $this->createInvoiceItems();
            $invoice_x->displayInvoice();
        }

    }

Вывод: (из класса «тест-драйв», которого нет в этом посте - просто вызывает метод runProcess() в классе ProcessInvoice)

Item ID: // Item Quanity: // Item Price: // Item Description: // Total: $
Invoice Total: $0 

1 Ответ

1 голос
/ 03 марта 2020

Если Invoice::$invoiceItems является массивом, вам нужно добавить в него счета, вы просто перезаписываете свойство.

Создаете:

public function addInvoiceItem(InvoiceItem $invoiceItem)
{
    $this->invoiceItems[] = $invoiceItem;
    return $this;
}

И если вам нужно добавить несколько Вы вызываете один и тот же метод несколько раз:

$this->invoice->addInvoiceItem($item1)
        ->addInvoiceItem($item2)
        ->addInvoiceItem($item3);

Кроме того, ваш конструктор не имеет особого смысла. Почему вы создаете массив с пустым InvoiceItem?

Лучше просто сделайте это и начните с правильно пустого массива:

private $invoiceItems = [];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...