Php die函数是否只接受字符串?

Php die函数是否只接受字符串?,php,mysqli,Php,Mysqli,此代码适用于: 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

此代码适用于:

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”是错误的,因此出现了一个错误,但我没有关闭页面,错误后内容仍然出现。为什么?谢谢

构造函数中的
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
,这意味着不允许您直接访问此属性。因此,您应该通过以下方式之一(至少)使其可访问:

  • 公开,
  • 实施科学和神奇的方法
  • 实现一个getter方法
使用公共
$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;
使用
\u isset
\u 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;
}

非常感谢。这让我明白了很多。非常感谢:)你为什么会提到魔术,而你却没有得到/设置者?@Robert,好吧,我不妨提到图案设计。但是我刚刚添加了关于getters=)的信息,啊,这里不需要setters。我怀疑他是否希望用户将其错误设置为DBAL。谢谢。使用getter仍然比使用magic方法或public方法要好property@Robert,优先权的问题