Автозагрузка класса PHP при динамическом создании класса? - PullRequest
1 голос
/ 25 ноября 2011

Этот простой пример не работает, дает мне:

Неустранимая ошибка: spl_autoload () [function.spl-autoload]: не удалось загрузить класс GmailServer.

define('USERNAME', 'username');
define('PASSWORD', 'password');
$SERVER = 'GmailServer';

spl_autoload_extensions(".php");
spl_autoload_register();

use Service\Mail\GmailServer;

$server = new $SERVER(USERNAME, PASSWORD);

Хотя, конечно, это работает:

$server = new GmailServer(USERNAME, PASSWORD);

Я что-то упускаю?

РЕДАКТИРОВАТЬ : Работа с отражением (ноВы должны указать полное пространство имен):

$reflector = new \ReflectionClass("Service\\Mail\\$SERVER");
$server = $reflector->newInstance(USERNAME, PASSWORD);

1 Ответ

1 голос
/ 25 ноября 2011

Возможно ли запустить это?

class Foo { }
$c = "Foo";
$f = new $c();

Если это так, это может быть связано с пространством имен.Если нет, а также, я бы предпочел сделать это, чем использовать эту причуду, использовать фабричный шаблон:

static class ServerFactory 
{
    public static function GetServer($server, $username, $password)
    {
         switch ($server)
        {
            case "GmailServer": return new GmailServer($username, $password);   
        }      
    } 
}
...