OOP (uso benéfico)

pela minha pergunta sobrecomo usar OOP de forma benéfica Eu assumo como um exemplo um CESTO ao qual seu dono (Tom) tendo um determinado ENDEREÇO ​​(NY) pode adicionar ARTIGOS (Bicicleta, Carro). Finalmente, um BILL é impresso contendo todas essas informações.

Meu problema é: Como lidar com a coleta das informações desejadas (aqui: proprietário, cidade, quantidade de itens) de vários objetos? Porque eu acho que é estúpido fazer isso manualmente como feito abaixo (veja 4.), não é? (ainda mais desde que a quantidade de informação aumenta na realidade)

Então, qual é o "caminho limpo" para criar a conta / coletar as informações necessárias neste exemplo?

<code><?php
$a = new basket('Tom','NY');
$a->add_item("Bike",1.99);
$a->add_item("Car",2.99);

$b = new bill( $a );
$b->do_print();
</code>

1

<code>class basket {

    private $owner = "";
    private $addr = "";
    private $articles = array();

    function basket( $name, $city ) {
        // Constructor
        $this->owner = $name;
        $this->addr = new addresse( $city );

    }

    function add_item( $name, $price ) {
        $this->articles[] = new article( $name, $price );
    }

    function item_count() {
        return count($this->articles);
    }

    function get_owner() {
        return $this->owner;
    }

    function get_addr() {
        return $this->addr;
    }

}
</code>

2

<code>class addresse {

    private $city;

    function addresse( $city ) {
        // Constructor
        $this->city = $city;
    }

    function get_city() {
        return $this->city;
    }

}
</code>

3

<code>class article {

    private $name = "";
    private $price = "";

    function article( $n, $p ) {
        // Constructor
        $this->name = $n;
        $this->price = $p;
    }   

}
</code>

4

<code>class bill {

    private $recipient = "";
    private $city = "";
    private $amount = "";

    function bill( $basket_object ) {

        $this->recipient = $basket_object->get_owner();
        $this->city = $basket_object->get_addr()->get_city();
        $this->amount = $basket_object->item_count();

    }

    function do_print () {
        echo "Bill for " . $this->recipient . " living in " . $this->city . " for a total of " . $this->amount . " Items.";
    }

}
</code>

questionAnswers(3)

yourAnswerToTheQuestion