<?php // phpcs:ignoreFile /** * Summary of the File DocBlock. * * Description of the File. * * @package Luigi\Pizza * @author Mike van Riel <me@mikevanriel.com> */ namespace Luigi\Pizza { /** * The high VAT percentage. * * This describes the VAT percentage for all non-food items. * * @var integer */ const VAT_HIGH = 21; /** * The low VAT percentage. * * This describes the VAT percentage for all non-food items. * * @var integer */ define('Luigi\Pizza\VAT_LOW', 6); /** * @var integer SIZE_5CM A 5 centimeter pizza size. * @var integer SIZE_10CM A 10 centimeter pizza size. * @var integer SIZE_15CM A 15 centimeter pizza size. * @var integer SIZE_20CM A 20 centimeter pizza size. * @var integer DEFAULT_SIZE The default Pizza size if you don't provide your own. */ const SIZE_5CM = 5, SIZE_10CM = 10, SIZE_15CM = 15, SIZE_20CM = 20, DEFAULT_SIZE = SIZE_20CM; trait ExampleNestedTrait { private function exampleTraitMethod() { } } /** * A single item with a value * * Represents something with a price. */ trait HasPrice { use ExampleNestedTrait; private $temporaryPrice = 1; public function getPrice() { return $this->price; } } /** * Any class implementing this interface has an associated price. * * Using this interface we can easily add the price of all components in a pizza by checking for this interface and * adding the prices together for all components. */ interface Valued { const BASE_PRICE = 1; function getPrice(); } interface Series { } interface Style extends Valued { } interface Sauce extends Valued { } interface Topping extends Valued, \Serializable { } abstract class PizzaComponentFactory implements \Traversable, Valued { public function add() { } /** * Calculates the price for this specific component. * * @param float[] $...additionalPrices Additional costs may be passed * * @return float */ abstract protected function calculatePrice(); } final class StyleFactory extends PizzaComponentFactory { public function getPrice() { } protected function calculatePrice() { } } final class SauceFactory extends PizzaComponentFactory { public function getPrice() { } protected function calculatePrice() { } } final class ToppingFactory extends PizzaComponentFactory { public function getPrice() { } protected function calculatePrice() { } } final class ItalianStyle implements Style { use HasPrice; private $price = 2.0; } final class AmericanStyle implements Style { use HasPrice; private $price = 1.5; } final class TomatoSauce implements Sauce { use HasPrice; private $price = 1.5; } final class CheeseTopping implements Topping { use HasPrice; private $price = 1.5; public function serialize() { } public function unserialize($serialized) { } } } namespace Luigi { /** * Class representing a single Pizza. * * This is Luigi's famous Pizza. * * @package Luigi\Pizza */ class Pizza implements Pizza\Valued { /** * The packaging method used to transport the pizza. */ const PACKAGING = 'box'; const /** @var string DELIVERY designates that the delivery method is to deliver the pizza to the customer. */ DELIVERY = 'delivery', /** @var string PICKUP designates that the delivery method is that the customer picks the pizza up. */ PICKUP = 'pickup'; /** @var static contains the active instance for this Pizza. */ static private $instance; /** * @var Pizza\Style $style * @var Pizza\Sauce|null $sauce * @var Pizza\Topping[] $toppings */ private $style, $sauce, $toppings; /** * The size of the pizza in centimeters, defaults to 20cm. * * @var int */ public $size = \Luigi\Pizza\SIZE_20CM; var $legacy; // don't use this anymore! protected /** @var string $packaging The type of packaging for this Pizza */ $packaging = self::PACKAGING, /** @var string $deliveryMethod Is the customer picking this pizza up or must it be delivered? */ $deliveryMethod; private function __construct(Pizza\Style $style) { $this->style = $style; } /** * Creates a new instance of a Pizza. * * This method can be used to instantiate a new object of this class which can then be retrieved using * {@see self::getInstance()}. * * @param Pizza\Style $style * * @see self::getInstance to retrieve the pizza object. * * @return void */ public static function createInstance(Pizza\Style $style) { self::$instance = new static($style); } /** * @return self */ static function getInstance() { return self::$instance; } final public function setSauce(Pizza\Sauce $sauce) { $this->sauce = $sauce; } final public function addTopping(Pizza\Topping $topping) { $this->toppings[] = $topping; } public function setSize(&$size = \Luigi\Pizza\SIZE_20CM) { } public function getPrice() { } } }