【发布时间】: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->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