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;
}
Спасибо! Это очень помогло мне понять. Очень ценится :) – captinmajid
почему вы упомянули магические методы, и вы не получили геттеры/сеттеры? – Robert
@ Robert, ну, я мог бы также упомянуть образцы рисунков. Но я только что добавил информацию о getters =) Ах, нет необходимости в сеттерах здесь. Я сомневаюсь, что он ожидает, что пользователь установит свою ошибку в DBAL. Благодарю. –