7

これはしばらくの間私を悩ませてきましたが、私はそれを理解できないようです.

私の phpinfo は、PDO がインストールされていることを報告し、index.php ファイルでデータベースに接続できます。しかし、名前空間を持つクラスで PDO 接続を開こうとすると、php は autoload 関数を使用して PDO.php を見つけようとしますが、これは機能しません。

私のクラスは次のとおりです。

abstract class {

    protected $DB;

    public function __construct()
    {
        try {  
          $this->DB = new PDO("mysql:host=$host;port=$port;dbname=$dbname", $user, $pass);
        }  
        catch(PDOException $e) {  
            echo $e->getMessage();  
        }
    }
}

そして、エラーは

Warning: require_once((...)/Model/PDO.php): failed to open stream: No such file or directory in /(...)/Autoloader.php

Fatal error: require_once(): Failed opening required 'vendor/Model/PDO.php' (include_path='.:/Applications/MAMP/bin/php/php5.4.4/lib/php') in /(...)/Autoloader.php

私が知る限り、PHP PDO拡張機能がインストールされているため、オートローダーを呼び出す必要があります(はい、完全に確信しています)。

私のオートロードは次のとおりです。

spl_autoload_register('apiv2Autoload');

/**
 * Autoloader
 * 
 * @param string $classname name of class to load
 * 
 * @return boolean
 */
function apiv2Autoload($classname)
{
    if (false !== strpos($classname, '.')) {
        // this was a filename, don't bother
        exit;
    }

    if (preg_match('/[a-zA-Z]+Controller$/', $classname)) {
        include __DIR__ . '/../controllers/' . $classname . '.php';
        return true;
    } elseif (preg_match('/[a-zA-Z]+Mapper$/', $classname)) {
        include __DIR__ . '/../models/' . $classname . '.php';
        return true;
    } elseif (preg_match('/[a-zA-Z]+Model$/', $classname)) {
        include __DIR__ . '/../models/' . $classname . '.php';
        return true;
    } elseif (preg_match('/[a-zA-Z]+View$/', $classname)) {
        include __DIR__ . '/../views/' . $classname . '.php';
        return true;
    }
}

何か助けてください。

4

1 に答える 1

19

それは実際にはオートロードの問題ではありません。ルート名前空間でクラスを呼び出そうとしています。

一見すると、あなたはいくつかの「モデル」名前空間にいて、 を呼び出しています。名前空間はデフォルトで相対的PDOであることを覚えておく必要があります。

あなたが望むのは、絶対パスを呼び出すことです:

\PDO

または、ファイルの先頭で、次のように PDO を使用することを伝えます。

use PDO;
于 2013-07-28T15:49:25.797 に答える