构造函数中的PHP全局PDO对象

时间:2014-04-12 13:20:23

标签: php pdo constructor

我有一个"电子邮件"类。我试图做的是将数据库与PDO连接。但我希望PDO对象可以从我定义的类的任何函数访问。因此我尝试构建一个构造函数逻辑。我所做的是:

Class Email
{
protected $dbh;

public function __construct()
{
    if (isset($_GET['rm']) && method_exists('Email', $_GET['rm'])) {
        $this->$_GET['rm']();
    }
    else
    {
        echo "No such a function";
    }

    $this->dbh = $this->connect_db();
}

public function index()
{
    var_dump($this->dbh);
}

private function connect_db()
{
    $hostname = 'localhost';
    $username = 'root';
    $password = '';

    try {
        $dbh = new PDO("mysql:host=$hostname;dbname=email", $username, $password);
        return $dbh;
        }
    catch(PDOException $e)
        {
        echo $e->getMessage();
        }
    }
}
$email = new Email();

当我在索引方法中var_dump PDO对象时,它变为" null"。

为什么你认为它不起作用?我该如何改进这种结构? 谢谢!

2 个答案:

答案 0 :(得分:0)

  

为什么你们认为它不起作用?

可能是因为您在未初始化的对象上调用方法:

public function __construct()
{
    if (isset($_GET['rm']) && method_exists('Email', $_GET['rm'])) {
        $this->$_GET['rm']();  // <- call on an uninitialized object
    }
    // […]
    $this->dbh = $this->connect_db(); // <- too late initialization
}

此构造函数调用依赖于正确初始化对象的方法($this->$_GET['rm']())。但是在该方法调用之后将初始化属性$dbh

而不是修复(通过在调用之前移动$dbh的初始化),你应该扔掉那段代码!调用请求所需的任何方法($_GET['rm'])是一个非常危险的想法。此外,在构造函数中有副作用是一个奇怪的想法。让构造函数仅初始化您的对象并在该初始化对象上调用该方法。

  

我怎样才能改善这种结构?

您正在寻找依赖注入。一个非常简单的方法可能是基于构造函数的DI:

public function __construct(PDO $dbh)
{
    $this->dbh = $dbh;
}

除此之外还有一些DI container for PHP。选择您喜欢的一个(例如PHP-DI)或您选择框架的那个。

答案 1 :(得分:-1)

你需要移动这个

 $this->dbh = $this->connect_db();

进入if声明。

喜欢这个..

public function __construct()
    {
        if (isset($_GET['rm']) && method_exists('Email', $_GET['rm'])) {
            $this->dbh = $this->connect_db(); //<----- Moved here !
            $this->$_GET['rm']();
        }
        else
        {
            echo "No such a function";
        }

    }

<强> OUTPUT :

object(PDO)[2]

NULL的原因:

您收到NULL因为,即使在为var_dump()