<?php require_once(__DIR__ . '/FormatInterface.php'); class Format { static protected $dirFormat; public function __construct(){ throw new \LogicException('Please use ' . __CLASS__ . '::create for new object.'); } static public function create($nameFormat){ if(!preg_match('@^[A-Z][a-zA-Z]*$@', $nameFormat)){ throw new \InvalidArgumentException('Name format must be at least one uppercase follow or not by alphabetic characters.'); } $nameFormat = $nameFormat . 'Format'; $pathFormat = self::getDir() . $nameFormat . '.php'; if(!file_exists($pathFormat)){ throw new \Exception('The format you looking for does not exist.'); } require_once $pathFormat; return new $nameFormat(); } static public function setDir($dirFormat){ if(!is_string($dirFormat)){ throw new \InvalidArgumentException('Dir format must be a string.'); } if(!file_exists($dirFormat)){ throw new \Exception('Dir format does not exist.'); } self::$dirFormat = $dirFormat; } static public function getDir(){ $dirFormat = self::$dirFormat; if(is_null($dirFormat)){ throw new \LogicException(__CLASS__ . ' class need to know format path !'); } return $dirFormat; } /** * Read format dir and catch informations about each format depending annotation * @return array Informations about each format */ static public function searchInformation(){ $pathDirFormat = self::getDir(); $listFormat = array(); $searchCommonPattern = array('name'); $dirFiles = scandir($pathDirFormat); if($dirFiles !== false){ foreach($dirFiles as $fileName){ if(preg_match('@^([^.]+)Format\.php$@U', $fileName, $out)){ // Is PHP file ? $listFormat[] = $out[1]; } } } return $listFormat; } }