data[$name])) { $this->data[$name] += $count; } else { $this->data[$name] = $count; } } public function remove(string $name) { if (!isset($this->data[$name])) { return; } unset($this->data[$name]); } public function __toString() { $lines = ['Content:']; foreach ($this->data as $name => $count) { $lines[] = " $name : $count"; } $lines[] = ''; return implode("\n", $lines); } // Exercise 2 public function offsetExists($offset): bool { return isset($this->data[$offset]); } public function &offsetGet($offset) { return $this->data[$offset]; } public function offsetSet($offset, $value): void { $this->data[$offset] = $value; } public function offsetUnset($offset): void { if (!isset($this->data[$offset])) { return; } unset($this->data[$offset]); } // public function current() { return current($this->data); } public function key() { return key($this->position); } public function next(){ next($this->data); } public function rewind() { reset($this->data); } public function valid() { return isset($this->data[$this->position]); } } // Exercise 3 interface Writer { public function write(ShoppingCart &$cart); } class JsonWriter implements Writer { public function write(ShoppingCart &$cart) { $content = []; foreach($cart as $key => $value) { $content[$key] = $value; } return json_encode($content); } } class StringWriter implements Writer { public function write(ShoppingCart &$cart) { return (string)$cart; } } function createWriter($name): Writer { $className = ucfirst($name)."Writer"; return new $className(); } // Exercise 1 $cart = new ShoppingCart(); $cart->add('milk', 1); $cart->add('bread', 1); $cart->add('basil', 1); $cart->add('milk', 1); $cart->remove('basil'); print($cart); // Exercise 2 print("Content:\n"); $cart['apple'] = 2; ++$cart['apple']; foreach($cart as $name => $count) { print( " $name : $count\n"); } // Exercise 3 print("JSON\n"); print(createWriter("json")->write($cart)); print("\nSTRING\n"); print(createWriter("string")->write($cart)); print("\n");