2012-11-20 130 views
2

我一直在搜索论坛上的问题数据库,但无法获得面向我的问题的解决方案。使用自定义自动加载器加载php核心类

我来找你,因为我怀疑自己正在开发自动加载器。

问题是,当我尝试实例化一个由我定义的类时,自动加载器工作正常,但是当我尝试实例化一个PHP核心类时,会引发以下错误。

例如,当我尝试这样做:

$conn = new PDO (...); 

然后抛出我下面的错误:

Fatal error: Class 'PDO' not found in ... 

我注意到,自动装卸试图加载的类从哪个我已经定义了到我的课程的路线。

我的问题是,如果我使用自定义自动加载器,我该如何加载一个PHP内核的类?

我希望你能指导我解决我已经提出的这个问题。

提前非常感谢你。

对不起,我没有放置自定义自动加载器的代码,我错过了。

该代码与symfony中使用的代码相同,但修改和简化。

class ClassLoader { 

private $prefixes = array(); 
private $fallbackDirs = array(); 
private $useIncludePath = false; 

public function getPrefixes () { 
    return $this->prefixes; 
} 

public function getFallbackDirs () { 
    return $this->fallbackDirs; 
} 

public function addPrefixes (array $prefixes) { 
    foreach ($prefixes as $prefix => $path) { 
     $this->addPrefix ($prefix, $path); 
    } 
} 

public function addPrefix ($prefix, $paths) { 
    if (!$prefix) { 
     foreach ((array) $paths as $path) { 
      $this->fallbackDirs [] = $path; 
     } 
     return; 
    } 
    if (isset ($this->prefixes [ $prefix ])) { 
     $this->prefixes [ $prefix ] = array_merge ($this->prefixes [ $prefix ], (array) $paths); 
    } else { 
     $this->prefixes [ $prefix ] = (array) $paths; 
    } 
} 

public function setUseIncludePath ($useIncludePath) { 
    $this->useIncludePath = $useIncludePath; 
} 

public function getUseIncludePath() { 
    return $this->useIncludePath; 
} 

public function register ($prepend = false) { 
    spl_autoload_register (array ($this, 'loadClass') , true, $prepend); 
} 

public function unregister() { 
    spl_autoload_unregister (array ($this, 'loadClass')); 
} 

public function loadClass ($class) { 

    if ($file = $this->findFile ($class)) { 
     require $file; 
     return true; 
    } 
} 

public function findFile ($class) { 
    if ('\\' == $class [ 0 ] ) { 
     $class = substr ($class, 1); 
    } 
    if (false !== $pos = strrpos ($class, '\\')) { 
     // namespaced class name 
     $classPath = str_replace ('\\', DIRECTORY_SEPARATOR, substr ($class, 0, $pos)) . DIRECTORY_SEPARATOR; 
     $className = substr ($class, $pos + 1); 
    } else { 
     // PEAR-like class name 
     $classPath = null; 
     $className = $class; 
    } 
    $classPath .= str_replace ('_', DIRECTORY_SEPARATOR, $className) . '.php'; 
    foreach ($this->prefixes as $prefix => $dirs) { 
     if (0 === strpos ($class, $prefix)) { 
      foreach ($dirs as $dir) { 
       if (file_exists ($dir . DIRECTORY_SEPARATOR . $classPath)) { 
        return $dir . DIRECTORY_SEPARATOR . $classPath; 
       } 
      } 
     } 
    } 
    foreach ($this->fallbackDirs as $dir) { 
     if (file_exists ($dir . DIRECTORY_SEPARATOR . $classPath)) { 
      return $dir . DIRECTORY_SEPARATOR . $classPath; 
     } 
    } 
    if ($this->useIncludePath && $file = stream_resolve_include_path ($classPath)) { 
     return $file; 
    } 
} 

}

但是,如果你想看到原来的文件就在这里

https://github.com/symfony/symfony/blob/master/src/Symfony/Component/ClassLoader/ClassLoader.php

+3

声音对我说,PDO扩展未加载。 – xelber

+0

PDO是否适用于普通脚本?例如。 PDO未安装/加载? –

+0

另外,共享自动加载器代码可能会有所帮助 – Achilles

回答

2

检查PDO扩展装载和PDO作品,未经注册的自动加载器。自动加载器不应该影响核心类,并且不需要自动加载器来加载核心类。

+0

我已经完成了它,它的工作完美,这是一个用于生产的代码,它的工作原理,但我创建了一个新的代码开发线来更新和管理命名空间。从我研究过的,它不应该影响核心类加载,但我没有做一个自动加载器来加载,它只是加载我的类。 –

3

我的朋友们。

我得到了我没有加载PHP核心的PDO类的原因。

根据我的研究,我做的两件事情之一:

或者放一个反斜杠的类实例

$conn = new \PDO (...); 

的时间或将PDO类使用子句。

use api\ecobd\nucleo\Conexion, PDO; 

我评论说,我选择了第二个,因为第一个没有工作。反正给予帮助

谢谢,我受益匪浅,以更好地针对我的搜索解决我的问题:)