2016-10-23 2 views
1

этот код работает:Функция die принимает только строки?

if (isset($db->error)) { 
    echo $db->error; 
} 

Этот код в не работает:

if (isset($db->error)) { 
    die($db->error); 
} 

Это мой DB класс:

class Db { 

    private $db, 
      $error; 


    public function __construct() { 
     return $this->db = new mysqli(DB_SERVER, DB_USER, DB_PASS, D_NAME); 
     if ($this->db->connect_error) { 
      $this->error = $this->db->connect_error; 
     } 
    } 

} 

"d_name" является неправильным, так появляется ошибка, но я не убил страницу, содержимое по-прежнему появляется после ошибки. Зачем? Благодаря!

ответ

2

if блок в конструкторе никогда не выполняется, потому что вы возвращаетесь $this->db:

public function __construct() { 
     return $this->db = new mysqli(DB_SERVER, DB_USER, DB_PASS, D_NAME); 
     // the lines after return will never be executed! 
} 

Это первая причина, почему $db->error снята с охраны.

Вторая причина заключается в том, что член $error является private, что означает, что вы не имеете права доступа к этому объекту недвижимости напрямую. Таким образом, вы должны сделать его доступным в одном из следующих способов (по крайней мере):

  • обнародует его;
  • внедрение __get и __isset магические методы;
  • реализовать метод геттера.

Использование общественных $error

class Db { 
    private $db; 
    public $error; 

    public function __construct() { 
    $this->db = new mysqli('localhost', 'sss3', 'a4J1uQzQCasD', 's3_small'); 
    if ($this->db->connect_error) { 
     $this->error = $this->db->connect_error; 
    } 
    return $this->db; 
    } 

} 

$db = new Db; 
if (isset($db->error)) { 
    die($db->error); 
} 

echo 'xxx', PHP_EOL; 

Использование __isset и __get магические методы

class Db { 
    private $db; 
    private $error; 

    public function __construct() { 
    $this->db = new mysqli('localhost', 'sss3', 'a4J1uQzQCasD', 's3_small'); 
    if ($this->db->connect_error) { 
     $this->error = $this->db->connect_error; 
    } 
    return $this->db; 
    } 

    public function __get($key) { 
    if ($key === 'error') { 
     return $this->error; 
    } 
    } 

    public function __isset($key) { 
    if ($key === 'error') { 
     return isset($this->error); 
    } 
    } 

} 

$db = new Db; 
if (isset($db->error)) { 
    die($db->error); 
} 

echo 'xxx', PHP_EOL; 

Реализация метод получения

Метод геттера - это всего лишь метод, возвращающий значение частного члена. В нашем случае это $error. Поэтому вы можете оставить его закрытым, но добавить метод для доступа к его значению. Например:

public function getError() { 
    return $this->error; 
} 
+0

Спасибо! Это очень помогло мне понять. Очень ценится :) – captinmajid

+0

почему вы упомянули магические методы, и вы не получили геттеры/сеттеры? – Robert

+0

@ Robert, ну, я мог бы также упомянуть образцы рисунков. Но я только что добавил информацию о getters =) Ах, нет необходимости в сеттерах здесь. Я сомневаюсь, что он ожидает, что пользователь установит свою ошибку в DBAL. Благодарю. –

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