2012-11-20 173 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; 

我評論說,我選擇了第二個,因爲第一個沒有工作。反正給予幫助

謝謝,我受益匪淺,以更好地針對我的搜索解決我的問題:)