2011-03-28 101 views
1

我有一个奇怪的问题。我有一个加载类的静态方法(load_library)。当它加载一个特定的类时,它给了我一个“无法重新声明类”的致命错误,但是在使用load_library方法加载它之前测试该类是否存在时,它说该类不存在。 load_library方法在没有这种错误的地方工作。混淆“无法重新声明类”错误(PHP)

如果我把load_library调用出来,它说它在几行后实际使用类时找不到类。更奇怪的是,如果我取出我的注册类autoload函数,而不是完全正常工作,即使此功能甚至不检查我尝试加载的类所在的目录。

这是一个复杂的问题涉及很多文件,所以很难发布代码,但是这个问题对于那些人来说很熟悉吗?

我load_library方法:

public static function load_library($name) { 
     if (!class_exists($name)) { 
      if (file_exists('application/libraries/' . $name . '.php')) { 
       include('application/libraries/' . $name . '.php'); 
      } else { 
       trigger_error('Request made for non-existant library ('.$name.').', E_USER_ERROR); 
      } 
     } 
    } 

我调用load_library方法:

lev::load_library('lev_unit_tester/lev_base_test'); 

我的注册自动加载方法:

public static function autoloader($name) { 
     if (class_exists($name)) return; 
     if (file_exists('application/libraries/' . $name . '.php')) { 
      include('application/libraries/' . $name . '.php'); 
     } 
    } 

我试图加载的类(本是发生错误的地方):

abstract class lev_base_test { 

} 

实际的错误信息:

Fatal error: Cannot redeclare class lev_base_test in /some/path/application/libraries/lev_unit_tester/lev_base_test.php on line 5

回答

0

试试这个

// Check to see whether the include declared the class 
    if (!class_exists($class, false)){..} 
+0

当我做的包括是当我得到的错误。我查看了在我做包含之前这个类是否存在。 – dqhendricks 2011-03-28 04:51:26

+0

它没有。 – dqhendricks 2011-03-28 04:51:45

0

你在呼唤你的load_library方法是这样的:

lev::load_library('lev_unit_tester/lev_base_test'); 

这意味着你正在测试,以class_exists(),如果有一个名为lev_unit_tester/lev_base_test类 - - 这可能不是这种情况:这不是一个有效的名字。因此class_exists()返回false;因此,每次调用load_library方法时,都会尝试包含包含类的文件。


有当您使用自动加载,因为PHP只能打电话给你的自动加载机时,您尝试使用尚未定义的类没有问题:一旦对应一个类文件已被收录,自动加载不会再次被该类调用。

+0

没有,类存在调用有一个说法 “lev_base_test” – dqhendricks 2011-03-28 04:44:27

+0

怪:似乎'class_exists()'接收相同的'$ name'参数作为'load_library'方法 - 和你得到的致命错误信息显示'$ name'是'lev_unit_tester/lev_base_test' – 2011-03-28 04:45:54

+0

class_exists调用使用一个文字字符串作为参数,其中load_library调用使用路径/文件名作为参数... – dqhendricks 2011-03-28 04:48:50