我一直在搜索论坛上的问题数据库,但无法获得面向我的问题的解决方案。使用自定义自动加载器加载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
声音对我说,PDO扩展未加载。 – xelber
PDO是否适用于普通脚本?例如。 PDO未安装/加载? –
另外,共享自动加载器代码可能会有所帮助 – Achilles