我一直在搜索論壇上的問題數據庫,但無法獲得面向我的問題的解決方案。使用自定義自動加載器加載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