<?php
declare(strict_types=1);
interface Product
{
public function calculatePrice(): int;
}
class ShippableProduct implements Product
{
private $productPrice;
private $shippingCosts;
public function __construct(int $productPrice, int $shippingCosts)
{
$this->productPrice = $productPrice;
$this->shippingCosts = $shippingCosts;
}
public function calculatePrice(): int
{
return $this->productPrice + $this->shippingCosts;
}
}
class DigitalProduct implements Product
{
private $price;
public function __construct(int $price)
{
$this->price = $price;
}
public function calculatePrice(): int
{
return $this->price;
}
}
class ProductFactory
{
const SHIPPING_COSTS = 50;
public function createShippableProduct(int $price): Product
{
return new ShippableProduct($price, self::SHIPPING_COSTS);
}
public function createDigitalProduct(int $price): Product
{
return new DigitalProduct($price);
}
}
$factory = new ProductFactory();
$product = $factory->createShippableProduct(150);
echo $product->calculatePrice();
echo "\n";
final class StaticFactory
{
public static function factory(string $type): Formatter
{
if ($type == 'number') {
return new FormatNumber();
} elseif ($type == 'string') {
return new FormatString();
}
throw new \InvalidArgumentException('Unknown format given');
}
}
interface Formatter
{
public function format(string $input): string;
}
class FormatString implements Formatter
{
public function format(string $input): string
{
return $input;
}
}
class FormatNumber implements Formatter
{
public function format(string $input): string
{
return number_format($input);
}
}
class SimpleFactory
{
public function createBicycle(): Bicycle
{
return new Bicycle();
}
}
class Bicycle
{
public function driveTo(string $destination)
{
}
}
$factory = new SimpleFactory();
$bicycle = $factory->createBicycle();
$bicycle->driveTo('Paris');
interface Logger
{
public function log(string $message);
}
class StdoutLogger implements Logger
{
public function log(string $message)
{
echo $message;
}
}
class FileLogger implements Logger
{
private $filePath;
public function __construct(string $filePath)
{
$this->filePath = $filePath;
}
public function log(string $message)
{
file_put_contents($this->filePath, $message . PHP_EOL, FILE_APPEND);
}
}
interface LoggerFactory
{
public function createLogger(): Logger;
}
class StdoutLoggerFactory implements LoggerFactory
{
public function createLogger(): Logger
{
return new StdoutLogger();
}
}
class FileLoggerFactory implements LoggerFactory
{
private $filePath;
public function __construct(string $filePath)
{
$this->filePath = $filePath;
}
public function createLogger(): Logger
{
return new FileLogger($this->filePath);
}
}
$loggerFactory = new StdoutLoggerFactory();
$logger = $loggerFactory->createLogger();