我怀疑我在这里遇到的主要问题是我对 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.php
在 lib
文件夹,这是在使用 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/