动态创建类时的PHP类自动加载?

时间:2011-11-24 21:53:44

标签: php reflection autoload

这个简单的例子不起作用,给我:

  

致命错误: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 个答案:

答案 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);   
        }      
    } 
}