2015-10-06 2 views
0

Im new для OOP и Im, который будет работать с простым классом-оболочкой php, mysql. Я не могу вызвать публичную функцию, это дает мне ошибку. Im неспособный понять это !!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

Можете ли вы Тил мне, как вызвать тест общественной функции?

ответ

2

Объяснение того, что происходит не так здесь немного многословно, так что медведь со мной.

В своем классе ребенка (дБ) 's конструктор, вы явно вызвать родительский класс (PDO)' s конструктор:

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

но вызов бросает исключение, которое вы ловите:

} catch (PDOException $e) { 

, а затем вы пытаетесь установить свойство объекта:

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

но $this ч (поскольку родительский конструктор не сработал!), поэтому он больше не является специальной ссылкой на текущий объект, но 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", ""); 

. ..но поскольку эта попытка создать экземпляр объекта db не удалась, $d имеет значение null. И тогда попытка вызвать $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 попытался выручить. Тем не менее, ОП просто не отпускает. –

+0

Спасибо за ваш ответ. на самом деле ничего плохого ожидать db соединение с портом 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

Пожалуйста upvote и выберите в качестве ответа, если он помог вам определить проблему с вашим кодом. Мой ответ был опубликован до eggyal! – user3791372

1

Если вы новичок в ООП, почему бы вам создать свой собственный класс, не имея достаточного опыта использования других классов? Это не принесет вам никакой пользы. Почти каждая строка вашего класса ошибочна.

Вместо этого научитесь использовать необработанный PDO. Это уже класс, думай, а не плохой. Он может сделать что-то лучше, чем ваша домашняя обертка. Сначала изучите PDO.

-3

Заменить строку:

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

С этим:

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

Почему? Можете ли вы дать какое-то объяснение причин, почему и почему вы ответили? – Martin

Смежные вопросы