Question

I have been reading Rafactoring by Martin Fowler and in the beginning of the book he uses an example application (written in Java), which I am trying to convert over to PHP for training purposes. (I have trimmed the code down to make this question, but it works if the variables are public.)

The trouble is to create a statement I need access to a value (see switch) using method getCode() of Movie class since $code is private. (Of course if all of the variables were public the code below would work, but I want to keep them private.)

Can someone please shed some light on how I would access the private variable calling the getCode() method of Movie from the switch in statement(). (Or if there is a better way to do it, let me know.)

class Movie {
    private $title;
    private $code;

    public function __construct($title, $code) {
        $this->title = $title;
        $this->code = $code;
    }

    public function getCode() {
        return $this->code;
    }

    public function getTitle() {
        return $this->title;
    }
}

class Rental {
    private $movie; // will carry a Movie object
    private $days;

    public function __construct(Movie $movie, $days) {
        $this->movie = $movie;
        $this->days = $days;
    }

    public function getMovie() {
        return $this->movie;
    }
}

class Customer {
    private $name;
    private $rentals; // will be a collection of Rental Objects

    public function __construct($name) {
        $this->name = $name;
    }

    public function addRental(Rental $rental) {
        $this->rentals[] = $rental;
    }

    public function statement() {
        $thisAmount = 0;

        foreach ($this->rentals as $each) {
            // what is the better way to call this value??????
            switch ($each->movie->code) {
                case 1:
                    $thisAmount+= ($each->days - 2) * 1.5;
                    break;

                case 2:
                    $thisAmount += $each->days * 3;
                    break;

                case 3:
                    $thisAmount += 1.5;
                    break;
            }

            // show figures for this rental
            $result = "\t" . $each->movie->title . "\t" . $thisAmount . "\n";
        }

        return $result;
    }
}

// pick a movie
$movie = new Movie('Star Wars', 0);
// now rent it
$rental = new Rental($movie, '2');

// now get statement
$customer = new Customer('Joe');
$customer->addRental($rental);

echo $customer->statement();
Was it helpful?

Solution

You are iterating over a collection of movie in your foreach. So you can do it this way:

foreach($this->rentals as $rental) {
   switch($rental->getMovie()->getCode()) {

Of course, you can leave your variable named each. I just find $movie more readable and understandable in this context.

OTHER TIPS

replace your line with just:

$each->getMovie->getCode()
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top