1

我怀疑我在这里遇到的主要问题是我对该函数的实际情况缺乏了解。spl_autoload_register()

基本上我正在尝试创建一个新网站并尝试使用比以前更好的系统(以前的系统没有类,没有结构,实际上什么都没有)。

我正在使用 Linux 机器来写这个。

我的结构是:

+index.php
-lib (folder)
    +toolset.inc.php
    -database (folder)
        +handler.php (uses PDO)
    -model
        +model1.php
        +model2.php
        +etc

等等。

我可以使用我从中调用lib的文件将任何这些类文件包含在结构中。但是,当我尝试在.toolset.inc.phpindex.phphandler.php

工具集.inc.php:

<?php
namespace lib;

function load($classNameSpace) {
    echo $classNameSpace."<br />";
    $include_path = __DIR__ . DIRECTORY_SEPARATOR . str_replace("\\", "/", $classNameSpace) . ".php";
    if(is_readable($include_path)){
        require_once($include_path);
    }
}

spl_autoload_register(__NAMESPACE__ . '\load');

?>

索引.php:

<?php
require_once("lib/toolset.inc.php");

use database\handler;

$test = new handler();
?>

/lib/database/handler.php(简化版,实际上我阅读了连接详细信息等):

<?php
namespace database;

class handler{
    //define some connection stuff
    (...)
    function __constructor(){
         $attrs[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
         $this->connection = new PDO(...);
    }
}

虽然我可以让处理程序文件包含在上述toolset.inc.php文件中,但我无法让 PDO 在其中工作。我已经搜索了几个小时的论坛、StackOverflow 和教程,但找不到我正在寻找的信息。

一些帖子和网站说我需要通过使用use \PDO$this->connection = new \PDO(...)在这种情况下都不能将 PDO 声明为绝对值。

我不知道为什么,我几乎完全相信这是因为我误解了一些东西,或者我错过了一些非常明显的东西。谁能解释为什么不能以这种方式包含 PDO,以及我需要做些什么才能根据需要将其包含在内?

非常感谢

编辑:-错误确实取决于我尝试的解决方案建议,但一个例子是:

Fatal error: Class 'PDO' not found in /var/www/html/toolset/lib/database/handler.php on line 63

虽然我知道这表示它正在寻找文件夹PDO.php中的lib文件,但这是在使用它调用它时,use \PDO;或者$test = = new \PDO(...)显然应该强制它使用 PHP 类而不是我指定目录中的一个(lib

4

1 回答 1

3

错误消息对我来说似乎很清楚,它与命名空间无关。PDO如果 PHP在您的命名空间中寻找类database,错误消息将显示为...

致命错误:找不到类 'database\PDO'

看来您根本没有加载 PDO 扩展。

仅供参考,一旦您加载了 PDO 扩展,我建议您使用该语句use。否则,您将必须在所有使用的PDO前面加上反斜杠(包括常量,如PDO::ATTR_ERRMODE)...

namespace database;

use \PDO;

class handler { ... }

此外,如果你所有的文件/目录名、类名和命名空间都是小写的,你可以放下你的自动加载器并简单地使用以下...

// toolset.inc.php:

set_include_path(implode(PATH_SEPARATOR, [
    __DIR__, // "lib"
    get_include_path()
]));

spl_autoload_extensions('.php');
spl_autoload_register();

这将使用用 C 编写的默认实现,spl_autoload并且比任何 PHP 实现都快得多。

于 2014-03-06T01:10:22.047 回答