我是OOP的新手,我将使用简单的php,mysql包装类。我无法调用公共函数,它给我一个错误。我无法弄明白!!
<?php
class db extends PDO {
private $error;
private $sql;
private $bind;
private $errorCallbackFunction;
private $errorMsgFormat;
public function __construct($dsn, $user="", $passwd="") {
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
try {
parent::__construct($dsn, $user, $passwd, $options);
}
catch (PDOException $e) {
$this->error = $e->getMessage();
}
}
public function test() {
echo 'whats wrong with this!!!';
}
}
$d = new db("mysql:host=127.0.0.1;port=8889;dbname=weddingplan", "root", "");
$d->test(); ?>
我的xampp服务器的结果是
警告:在第18行的C:\ xampp \ htdocs \ newwedding \ models \ class.db.php中从空值创建默认对象
致命错误:在第32行的C:\ xampp \ htdocs \ newwedding \ models \ class.db.php中调用null上的成员函数test()
请告诉我如何拨打公共功能测试?
答案 0 :(得分:2)
这里有什么问题的解释是有点啰嗦,所以请耐心等待。
在子类(db)的构造函数中,显式调用父类(PDO)的构造函数:
try {
parent::__construct($dsn, $user, $passwd, $options);
但是这个调用正在抛出异常,你会抓住它:
} catch (PDOException $e) {
然后你尝试设置对象的属性:
$this->error = $e->getMessage();
}
但$this
尚未实例化(因为父构造函数失败!) - 因此它不再是对当前对象的特殊引用,而是PHP将其视为任何其他变量(并尝试分配)到error
属性会导致PHP将\stdClass
的默认对象实例化为$this
而不是;因此相当神秘的警告:
警告:在第18行的C:\ xampp \ htdocs \ newwedding \ models \ class.db.php中从空值创建默认对象
坦率地说,这种行为是疯狂的,PHP真的应该做一些更加理智的事情,就像那时的纾困一样,但不过它会继续......
$d = new db("mysql:host=127.0.0.1;port=8889;dbname=weddingplan", "root", "");
...但是由于尝试实例化db
对象失败,$d
为空。然后,调用$d->test()
的尝试显然会因您看到的错误而失败:
致命错误:在第32行的C:\ xampp \ htdocs \ newwedding \ models \ class.db.php中调用null上的成员函数test()
那么,你应该怎么做才能解决它?好吧,你可以调查PDO构造函数的调用失败的原因(可能是错误的数据库连接细节)并纠正错误;您甚至可以更好地处理异常,以便更清楚地传达此类错误;您甚至可以在尝试实例化后检查$d
的值,以验证它是否成功...
但为什么要将PDO分类?您可以(也可能应该)直接使用它:
$d = new PDO("mysql:host=127.0.0.1;port=8889;dbname=weddingplan", "root", "");
答案 1 :(得分:1)
如果您是OOP的新手,为什么在没有足够使用其他课程经验的情况下创建自己的课程?它对你毫无益处。 几乎每堂课都错了。
相反,学习使用原始PDO。它已经是一个班级,请注意,而不是坏的。它可以比你自制的包装更好。首先学习PDO。
答案 2 :(得分:0)
您的示例代码似乎与您的实际代码不同,但您的测试方法似乎没问题。
Warning: Creating default object from empty value in C:\xampp\htdocs\newwedding\models\class.db.php on line 18
默认对象是没有构造函数的对象,确保您将参数传递给构造函数,它们应该是它们应该是什么(例如,不是空的!)
Fatal error: Call to a member function test() on null in C:\xampp\htdocs\newwedding\models\class.db.php on line 32
您的db对象为null,而不是您认为的那样。你不能在空对象上调用方法!
答案 3 :(得分:-3)
替换此行:
parent::__construct($dsn, $user, $passwd, $options);
有了这个:
new PDO($dsn, $user, $passwd, $options);