Autoloader PHP修改了被调用类的名称

时间:2019-04-09 19:24:15

标签: php oop autoload autoloader

我创建了一个Autoloader类,该类可以很好地与名称空间配合使用(例如:App \ Table \ Article OK)。

但是当我尝试加载包含其目录名称的类时,它不起作用(App \ Table \ UserTable不能正常运行)。

我在'require'之前尝试了var_dump,并且我已经看到自动加载器工作两次。

第一个var_dump返回预期的字符串:Table / UserTable

第二次删除班级名称,但不删除目录部分(App \ Table \ UserTable变为Table / Table)。

namespace App;

class Autoloader
{

  static function register(){

    spl_autoload_register(array(__CLASS__, 'autoload'));

  }

  public static function autoload($nomdelaclasse){

      $nomdelaclasse = str_replace(__NAMESPACE__.'\\', '', $nomdelaclasse);

      $nomdelaclasse = str_replace('\\', '/', $nomdelaclasse);

      var_dump($nomdelaclasse);

      require(__DIR__.'/'.$nomdelaclasse.'.php');

  }

}

(UserClass为空,这只是一个示例。 DIR 是C:\ wamp64 \ www \ test \ graphikart \ tp_structure \ app)

它返回:

  

致命错误:在第4行的C:\ wamp64 \ www \ test \ graphikart \ tp_structure \ app \ Table \ UserTable.php中找不到类“ App \ Table \ Table”

我不明白为什么自动加载会修改我的类名,为什么指令在调用require之前似乎能工作两次。

有人可以解释吗?

1 个答案:

答案 0 :(得分:1)

我认为您可能会使使用正斜杠的所有正则表达式变得比需要复杂。这是从配置运行的自动装带器的示例。该目录中的实际类文件名为(类似)“ class_does_something.php”,该文件中的实际类名称为...

class does_something
{

}

然后我使用

调用它
 $does_something = new does_something();

这是自动加载器:

function class_autoload($class)
{
    $filename = $class . '.php';
    $filepath = __DIR__ . '/path_to_classes_directory/class_' . $filename;
    if (!file_exists($filepath))
    {
        throw new Exception('Error_104: ' . $class);
    }
    else
    {
        try
        {
            include_once( $filepath );
        }
        catch(Exception $e)
        {
            echo $e->getMessage();
        }
    }
}
//engage the class autoloader
spl_autoload_register('class_autoload');