此代码有效:
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”错误,因此出现错误,但我没有杀死该页面,错误后内容仍然显示。为什么?谢谢!
答案 0 :(得分: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
,这意味着您不能直接访问此属性。因此,您应该通过以下方式之一访问(至少):
使用公开$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;
实施getter方法
getter方法只是一个返回私有成员值的方法。在我们的例子中,它是$error
。因此,您可以将其保密,但添加一个方法来访问其值。例如:
public function getError() {
return $this->error;
}