如何从自定义命名空间中访问PHP内部类

时间:2013-10-29 00:15:53

标签: php namespaces

如何从命名空间中访问标准内部类?

namespace foo;

class Bar{
    public function __construct(){
        $connect = new \PDO('mysql:host='.$host.';dbname='.$name, $user, $pass);
    }
}

我收到错误

failed to open stream PDO.php

我有自动加载器代码,适用于我的自定义类。如何让自动加载器忽略内部类?

我指的是这个链接,我的代码基于:

http://www.php.net/manual/en/language.namespaces.faq.php#language.namespaces.faq.globalclass

编辑:

所以,如果我放这样的东西,它似乎工作正常。但是,如果我不能在自己的课程中使用它,那又有什么意义呢?如何根据类属性使参数动态化?

namespace foo;
$connect = new \PDO('mysql:host='.$host.';dbname='.$name, $user, $pass);
class Bar{
    public function __construct(){
        //$connect = new \PDO('mysql:host='.$host.';dbname='.$name, $user, $pass);
    }
}

2 个答案:

答案 0 :(得分:1)

一些建议

首先,将PDO文件直接包含在您的班级中。我知道,这很令人反感,但有时是必要的。

第二种选择是首选。在其他地方创建PDO实例,然后将您的实例传递给该类。如果你这样做会减少混乱,因为你只会创建一次连接而不是几次。

namespace foo;
use PDO;
class Bar{
    /** @var \PDO */
    protected $pdo;

    public function __construct(){
        $this->pdo = new PDO('mysql:host='.$host.';dbname='.$name, $user, $pass);
    }
}

答案 1 :(得分:1)

我一直在使用内部PHP类的命名空间,上面的第一个代码应该可以正常工作,它确实(我试过)。有可能您的PDO扩展被禁用或配置错误。

您是否检查过PDO是否可用?查看PDO类是否存在。

echo class_exists('PDO') ? "PDO exists\n" : "No PDO\n";

如果没有,您必须启用它或使用--with-pdo-mysql重新编译PHP。