【问题标题】:Use of namepsace and global classes使用命名空间和全局类
【发布时间】:2014-04-07 03:10:32
【问题描述】:

我怀疑我在这里遇到的主要问题是我对spl_autoload_register() 函数真正发生了什么缺乏了解。

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

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

我的结构是:

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

等等。

我可以使用我从index.php 调用的文件toolset.inc.php 将这些类文件中的任何一个包含在lib 结构中。但是,当我尝试在 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-&gt;connection = new \PDO(...) 将 PDO 声明为绝对值,但在这种情况下,这些都不起作用。

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

非常感谢

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

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

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

【问题讨论】:

  • 1.这个问题与PDO或mysql无关。 2.“我无法让 PDO 在其中工作。”不是适合 Stack Overflow 的问题。您收到任何错误消息吗?如果不是 - 为什么?如果是的话 - 你为什么要为自己保留它们?
  • 知道我在工作中匆匆忙忙会错过一些东西。更新的问题。我在那里有 PDO 的原因是因为我不确定这是否是我尝试使用带有斜杠 ($test = new \PDO(...)) 的 PDO 的方式,或者它是否与 spl_autoloader 以及我如何设置它有关。两者都可能是原因。不知道 sql 标签是从哪里来的。
  • 斜杠不属于 PDO 而是属于命名空间。没关系,是 PDO、mysqli 还是 datetime 类

标签: php pdo namespaces spl-autoload-register


【解决方案1】:

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

致命错误:找不到类“数据库\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();

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

【讨论】:

  • 你是对的。似乎有人重建了服务器并且没有恢复原始配置。真生气,这么简单!
  • @Rekarin 我添加了另一个可以加快自动加载速度的点
  • 谢谢,我已将其添加为我的第一个 spl_autoload_register(),并将我现有的函数添加为第二个,以便其他人可以使用大写字母或使用第 3 方资源来编写它。再次感谢您的帮助和信息!
  • 糟糕。忽略了这种情况。
猜你喜欢
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多