我怀疑我在这里遇到的主要问题是我对真正在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时,我遇到了问题。
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
)
答案 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实现都快得多。