这个简单的例子不起作用,给我:
致命错误: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);
答案 0 :(得分:1)
可以运行吗?
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);
}
}
}