php - 命名空间和全局类的使用

标签 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.php 的结构我从 index.php 打来的电话.但是,当我尝试在 handler.php 中使用 PDO 时遇到了问题。 .

工具集.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 将 PDO 声明为绝对值。或 $this->connection = new \PDO(...)但是在这种情况下,这些都不起作用。

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

非常感谢

编辑:- 错误确实因我尝试的解决方案建议而异,但一个例子是:
Fatal error: Class 'PDO' not found in /var/www/html/toolset/lib/database/handler.php on line 63

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

最佳答案

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

Fatal error: Class 'database\PDO' not found



看来您只是没有加载 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();

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

关于php - 命名空间和全局类的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22191338/

相关文章:

php - fatal error : Uncaught PDOException: Column cannot be null (BUT it isn't null. ..)

带有 SQL Server 和准备好的语句的 PHP PDO

c++ - 如何在 cpp 中导入/包含字符串

linux - `ip netns exec`命令如何创建挂载命名空间?

php - 将 HTML 代码与 PHP 相结合

php - 自定义 Woocommerce 模板 my-account/form-edit-addresses

php - Wordpress 插件表单提交

php - 通过 URL 输入设置 Symfony 上传的文件

php - 使用 PDO 语句代替 mysql_query

css - 应该在 Firefox 的 userContent.css 中定义什么命名空间?