Como criar de forma segura e dinâmica uma instância de uma classe PHP existente?
Digamos que eu tenho um arquivo Foo.php:
<?php
interface ICommand
{
function doSomething();
}
class Foo implements ICommand
{
public function doSomething()
{
return "I'm Foo output";
}
}
?>
Se eu quiser criar uma classe do tipo Foo, eu poderia usar:
require_once("path/to/Foo.php") ;
$bar = new Foo();
Mas diga que eu criei umPadrão da Cadeia de Comando e eu tenho um arquivo de configuração que registra todas as classes possíveis e cria uma instância dessas classes com base nas strings presentes no arquivo de configuração.
register("Foo", "path/to/Foo.php");
function register($className, $classPath)
{
require_once($classPath); //Error if the file isn't included, but lets
//assume that the file "Foo.php" exists.
$classInstance = new $className; //What happens here if the class Foo isn't
//defined in the file "Foo.php"?
$classInstance->doSomething(); //And what happens here if this code is executed at
//all?
//Etc...
}
Como garantir que essas classes estejam realmente onde o arquivo de configuração diz que estão? E o que acontece se uma classe não estiver lá (mas o arquivo estiver), ele criará uma instância de uma classe gerada dinamicamente, sem descrição adicional?