2015-10-06 161 views
0

即时通讯新的OOP和即将使用简单的PHP,MySQL包装类。我无法调用公共函数,它给了我一个错误。我无法弄清楚它!PHP的mysql的PDO扩展类错误

<?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服务器

和结果

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

能否请你TEEL我如何调用公共功能测试?

回答

2

发生了什么事情错在这里的解释是有点啰嗦,如此忍受我。

在你的子类(DB)的构造函数,你明确地调用父类(PDO)的构造函数:

try { 
    parent::__construct($dsn, $user, $passwd, $options); 

但调用抛出一个异常,你可以捕获:

} catch (PDOException $e) { 

,然后尝试设置对象的属性:

$this->error = $e->getMessage(); 
} 

$this^h没有被实例化(因为父构造函数失败!) - 所以它不再是对当前对象的特殊引用,而是PHP将它视为任何其他变量(并且尝试分配给它的error属性导致PHP实例化改为\stdClass$this的默认对象);因此非常模糊的警告:

Warning: Creating default object from empty value in C:\xampp\htdocs\newwedding\models\class.db.php on line 18

坦率地说,这种行为是疯狂和PHP真正应该做的事情更加理智喜欢在这一点保释出来,但尽管如此,它前进...

$d = new db("mysql:host=127.0.0.1;port=8889;dbname=weddingplan", "root", ""); 

。 ..但是由于这个尝试实例化对象失败,$d为空。然后试图调用$d->test()明显失败,您看到的错误:

Fatal error: Call to a member function test() on null in C:\xampp\htdocs\newwedding\models\class.db.php on line 32

所以,你应该怎么做来解决它?那么,你可以调查为什么PDO构造函数的调用失败(可能是不正确的数据库连接细节)并纠正错误;你甚至可以更好地处理异常情况,以便更清楚地传达这种错误;你甚至可以在尝试实例化后检查$d的值,以验证它是否成功...

但是为什么子类PDO呢?你可以(并且可能应该)仅仅直接使用它:

$d = new PDO("mysql:host=127.0.0.1;port=8889;dbname=weddingplan", "root", ""); 
+0

PHP试图纾困。然而,OP不会放过它。 –

+0

感谢您的回答。实际上没有错误,期望数据库连接端口8889。 –

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 

您的数据库对象是空的,而不是你认为的那样。您无法在空对象上调用方法!

+0

感谢大家的响应 –

+0

请给予好评,并选择作为答案,如果它帮助你确定你的代码的问题。我的答案在eggyal's之前发布! – user3791372

1

如果您是OOP的新手,为什么要创建自己的班级,但没有足够的使用其他班级的经验?它会对你没有任何好处。 你班上几乎每一行都是错的。

相反,学会使用原始PDO。这已经是一堂课,介意你,并不是一件坏事。它可以做比你自己酿造的包装好的东西。先学习PDO。

-3

替换此行:

parent::__construct($dsn, $user, $passwd, $options); 

有了这个:

new PDO($dsn, $user, $passwd, $options); 
+2

为什么?你能解释一下你的答案的原因,原因和原因吗? – Martin