abstract class AbsctactFileProcessor
{
abstract public function supports($extension);
abstract public function process($file);
}
class ProcessingProvider
{
private $processors;
public function __construct()
{
$this->processors = array();
}
public function addProcessor(AbsctactFileProcessor $processor)
{
$this->processors[] = $processor;
return $this;
}
public function process($file)
{
$file = new \SplFileInfo($file);
$extension = $file->getExtension();
foreach ($this->processors as $processor) {
if ($processor->supports($extension)) {
return $processor->process($file);
}
}
throw new \LogicException();
}
}
class SimpleTextProcessor extends AbsctactFileProcessor
{
public function process($file)
{
// return ...
}
public function supports($extension)
{
return in_array($extension, array('txt'));
}
}
class ImageProcessor extends AbsctactFileProcessor
{
public function process($file)
{
// return ...
}
public function supports($extension)
{
return in_array($extension, array('png', 'gif', 'bmp', 'jpg'));
}
}
$provider = new ProcessingProvider();
$provider->addProcessor(new \SimpleTextProcessor());
$provider->addProcessor(new \ImageProcessor());
$provider->process('mybestfile.exe');