使用命名空间和全局类

时间:2014-03-05 07:29:38

标签: php pdo namespaces spl-autoload-register

我怀疑我在这里遇到的主要问题是我对真正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.php结构中包含这些类文件中的任何一个。但是,当我尝试在handler.php中使用PDO时,我遇到了问题。

toolset.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');

?>

的index.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

1 个答案:

答案 0 :(得分:3)

错误消息对我来说似乎很清楚,而且与命名空间无关。如果PHP在PDO命名空间中查找类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实现都快得多。