<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
pointybeard / helpers-foundation-factory example snippets
declare(strict_types=1);
namespace MyApp;
rface VehicleInterface
{
public function name(): string;
public function __toString(): string;
}
abstract class AbstractVehicle implements VehicleInterface
{
public function name(): string
{
return (new \ReflectionClass(static::class))->getShortName();
}
}
abstract class AbstractCar extends AbstractVehicle
{
public function __toString(): string
{
return "Hi! I'm a {$this->name()}.";
}
}
abstract class AbstractTruck extends AbstractVehicle
{
public function __toString(): string
{
return "Hi! I'm a truck called {$this->name()}.";
}
}
// Basic car
class Volvo extends AbstractCar
{
}
// Basic truck
class Mack extends AbstractTruck
{
}
// This adds a constructor which expects a model and vin number. They need
// to be passed in when CarFactory::build() is called
class Peugeot extends AbstractCar
{
private $model;
private $vin;
public function __construct(string $model, string $vin)
{
$this->model = $model;
$this->vin = $vin;
}
public function __get(string $name)
{
return $this->$name;
}
public function __toString(): string
{
return parent::__toString()." I am a model {$this->model} with vehicle identification number {$this->vin}";
}
}
// a Cabbage is not a type of vehicle
class Cabbage
{
}
// Create a factory called MyApp\CarFactory
Factory\create(
__NAMESPACE__.'\\CarFactory',
__NAMESPACE__.'\\%s',
__NAMESPACE__.'\\AbstractCar'
);
// Create a factory called MyApp\TruckFactory
Factory\create(
__NAMESPACE__.'\\TruckFactory',
__NAMESPACE__.'\\%s',
__NAMESPACE__.'\\AbstractTruck'
);
// Create custom factory class
class PeugeotFactory extends Factory\AbstractFactory
{
public function getTemplateNamespace(): string
{
return __NAMESPACE__.'\\%s';
}
public function getExpectedClassType(): ?string
{
return __NAMESPACE__.'\\Peugeot';
}
}
$car = CarFactory::build('Volvo');
var_dump((string) $car);
// string(16) "Hi! I'm a Volvo."
$car = PeugeotFactory::build('Peugeot', '206', 'VF32HRHYF43242177');
var_dump((string) $car);
// string(88) "Hi! I'm a Peugeot. I am a model 206 with vehicle identification number VF32HRHYF43242177"
$truck = TruckFactory::build('Mack');
var_dump((string) $truck);
// string(28) "Hi! I'm a truck called Mack."
try {
$car = PeugeotFactory::build('Volvo', 'XC60', 'YV1DZ8256C227123');
} catch (Factory\Exceptions\UnableToInstanciateConcreteClassException $ex) {
echo 'Error: Cannot build a Volvo in the Peugeot factory!'.PHP_EOL;
}
// Error: Cannot build a Volvo in the Peugeot factory!
try {
CarFactory::build('Suzuki');
} catch (Factory\Exceptions\UnableToInstanciateConcreteClassException $ex) {
echo 'Error: Unable to build a Suzuki. Returned: '.$ex->getMessage().PHP_EOL;
}
// Error: Unable to build a Suzuki. Returned: Class \MyApp\Suzuki does not exist
try {
CarFactory::build('Cabbage');
} catch (Factory\Exceptions\UnableToInstanciateConcreteClassException $ex) {
echo 'Error: Unable to build a Cabbage. Returned: '.$ex->getMessage().PHP_EOL;
}
// Error: Unable to build a Cabbage. Returned: Class \MyApp\Cabbage is not
// of expected type \MyApp\AbstractCar
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.