较旧的PHP版本修复

时间:2011-04-14 20:34:56

标签: 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?

4 个答案:

答案 0 :(得分: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的单独文件

不太漂亮,我同意。

答案 1 :(得分:4)

在PHP< 5.3中,您可以使用call_user_func

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

答案 2 :(得分:2)

答案非常简单:

    $admin_class = $module."Admin";

    $oAdmin = new $admin_class;

    return $oAdmin->get_admin($module);

答案 3 :(得分: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);

这会减少拼写错误的可能性。