我有一个"电子邮件"类。我试图做的是将数据库与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"。
为什么你认为它不起作用?我该如何改进这种结构? 谢谢!
答案 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()