2011-04-14 94 views
5

试图动态加载类:较早的PHP版本修复

require_once(PATH_MODULES."/{$module}/{$module}_admin.php");   
    $admin_class = $module."Admin";  
    return $admin_class::get_admin($module); 

上产生较老版本的PHP这样的错误:

Parse error: syntax error, unexpected 
T_PAAMAYIM_NEKUDOTAYIM in 
/home/user/public_html/folder/path/admin/filename.php on line 91 

我怎样才能改变这种代码为老版本的PHP的工作?

+0

重复:http://stackoverflow.com/questions/2491746/php-get-instance-of-static-class-by-string-value – 2011-04-14 20:38:59

回答

2

答案是非常简单的:

$admin_class = $module."Admin"; 

    $oAdmin = new $admin_class; 

    return $oAdmin->get_admin($module); 
+0

http://at-byte.com/technology/tpaamayimnekudotayim-php -Error For Reference – tlunter 2011-05-18 16:17:44

+2

你所做的与你在问题中所做的不相同。在这里你调用一个对象方法,在你的问题中调用一个(静态)类方法。 – NikiC 2011-05-19 14:22:06

5

您可能预料到的问题是,您不能在PHP中使用动态类名称< 5.3。这就是为什么::在变量之后出乎意料。

我看不出有什么办法可以解决这个问题。你不能做到这一点:

$admin_class::get_admin($module); 

如果这部分始终是相同的:

$admin_class = $module."Admin";  
return $admin_class::get_admin($module); 

你可以(!这是一个黑客)添加这些字符串,该模块与模块名字填写在课程中。或者为此制作一个单独的文件?

因此,对于模块"yourModule"您添加到"/yourModule/yourModule_admin.php"文件这些行:

$admin_class = "yourModuleAdmin";  
return yourModuleAdmin::get_admin($module); 

或者添加一个名为yourModule_admin.olderversions.php

不是太漂亮了一个单独的文件,我同意。

4

在PHP < 5.3,你可以使用call_user_func

return call_user_func(array($admin_class, 'get_admin'), $module); 
0

我会说,类似于你在你自己做了什么工厂模式去回答。

一种方法是

static class ModuleFactory 
{ 
    static public function get($moduleName) { 
    if(file_exists($moduleName)) { 
     $module= new $moduleName; 
     return $module; 
    } 
    else { 
     throw new Exception("Unkown module $moduleName"); 
    } 
    } 
} 

然后你做

$fooBar = ModuleFactory::get("foobar"); 

我不喜欢字符串标识符,并尽量避免他们当过可能的。所以,如果你已经知道了所有的模块,你可以做

static class ModuleFactory 
{ 
    const FOO = "foo"; 
    const BAR = "bar"; 

    static public function get($moduleName) { 
    if(file_exists($moduleName . '.php')) { 
     $module= new $moduleName; 
     return $module; 
    } 
    else { 
     throw new Exception("Unkown module $moduleName"); 
    } 
    } 
} 

然后你就可以做

$fooBar = ModuleFactory::get(ModuleFactory::FOO); 

这将减少让拼写错误的机会。