【问题标题】:How do I pass objects into an array via getters/setters across another class in PHP OOP?如何在 PHP OOP 中的另一个类中通过 getter/setter 将对象传递到数组中?
【发布时间】:2020-03-03 07:45:09
【问题描述】:

我不明白如何将 ProcessInvoice 类中实例化的 InvoiceItem 对象传递回我的数组以输出到页面。

查看帖子底部的输出。它应该输出数组中的所有 3 个项目和总发票总额。

我是否使用了$this 关键字错误??如何将对象传回Invoice 类中的invoiceItems 数组?

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

    }

输出:(来自本文中没有的“试驾”类 - 只需调用 ProcessInvoice 类中的 runProcess() 方法)

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

【问题讨论】:

    标签: php arrays oop


    【解决方案1】:

    如果Invoice::$invoiceItems 是一个数组,你需要向它添加发票,你只是覆盖了属性。

    创建:

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

    如果你需要添加几个,你多次调用相同的方法:

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

    此外,您的构造函数似乎没有多大意义。为什么要创建一个空的 InvoiceItem 数组?

    最好这样做,并从一个正确的空数组开始:

    private $invoiceItems = [];
    

    【讨论】:

    • 感谢@yivi 的回答。我将您的addInvoiceItem 函数放在我的Invoice 类中,为ProcessInvoice 类中的每个项目调用该方法,并删除了Invoice 类中的构造,而是将私有变量声明为private $invoiceItems = [];。听起来对吗?我得到的输出是页面上的Invoice Total: $ 。
    • 这不是错字,所以输出中有一个美元符号
    • 删除了“错字”部分。请记住,如果它可以帮助您解决问题,您可以“接受”答案。
    • 谢谢,仍在努力...仍然遇到与上述评论相同的问题
    猜你喜欢
    • 2014-03-05
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多