Php 使用名称空间自动加载PDO
在我的PHP项目中有一个名为DB的类,其中包含以下代码:Php 使用名称空间自动加载PDO,php,pdo,namespaces,autoload,Php,Pdo,Namespaces,Autoload,在我的PHP项目中有一个名为DB的类,其中包含以下代码: namespace classes\utility; use \PDO; class DB { /*object constructor*/ # connect to database private function __construct() { try { $conn = new PDO('sqlsrv:Server=' . DB_HOS
namespace classes\utility;
use \PDO;
class DB
{
/*object constructor*/ # connect to database
private function __construct()
{
try
{
$conn = new PDO('sqlsrv:Server=' . DB_HOST . ';Database=' . DB_NAME);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //to capture error messages returned by db
$this->setPdo($conn);
// echo 'connected'; //enable this line to test db connection
}
catch(PDOException $e)
{
die($e->getMessage());
}
}
以下自动加载器位于index.php中:
# autoload classes (this uses an anonymous function)
spl_autoload_register(function($className) {
// echo $className . '<br>';
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
if ($lastNsPos = strrpos($className, '\\')) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
// echo '<br>autoload: ' . $fileName . '<br>';
require $fileName;
});
#自动加载类(使用匿名函数)
spl_自动加载_寄存器(函数($className){
//回显$className。“
”;
$className=ltrim($className,'\\');
$fileName='';
$namespace='';
如果($lastnpsos=strrpos($className,'\\')){
$namespace=substr($className,0,$lastnpsos);
$className=substr($className,$lastnpspos+1);
$fileName=str\u replace('\\',目录分隔符,$namespace);
}
$fileName.=str_replace(“_”,目录分隔符,$className)。'.php';
//回显“
自动加载:”.$fileName.“
”;
需要$fileName;
});
对DB类进行这些修改时:removeuse\PDO
并在PDO构造函数前面加一个反斜杠,如so$conn=new\PDO('sqlsrv:Server='.DB_HOST.';Database='.DB_NAME)代码>这篇文章中推荐的:然后代码失败。这些信息是:
警告:require(classes\utility\PDO.php):无法打开流:第40行的C:\xampp\htdocs\MyProject\OOP\index.php中没有此类文件或目录
致命错误:require():无法在第40行打开C:\xampp\htdocs\MyProject\OOP\index.php中所需的“classes\utility\PDO.php”(include_path=';C:\xampp\php\PEAR)
为什么这样不行?我希望排除use语句,并通过在PDO构造函数中使用反斜杠让PHP自动加载PDO。Hi。如果要删除use指令,则需要在出现任何PDO之前添加反斜杠,其中包括下一行中的所有PDO::代码。我们还需要更多的代码才能达到100%的准确度。@Thomas-我尝试过添加反斜杠,比如$conn->setAttribute(\PDO::ATTR\u ERRMODE,\PDO::ERRMODE\u EXCEPTION)代码>但仍然得到相同的结果。我还尝试在PDOException前面添加一个反斜杠(不确定是否属于该异常),但没有效果。我错过了什么?另外,需要添加更多的代码以达到100%的准确率意味着什么?我想明白了。上面为DB类发布的代码只是该类的一部分。类后面的query()方法中有一个PDO::也需要反斜杠。在PDOException之前不需要反斜杠。我认为没有理由删除use\PDO
(事实上,我想说的是将它改为use\PDO\PDOException;
。至少这意味着你不必去寻找所有不带前缀的用法。