die函数只接受字符串吗?

时间:2016-10-23 16:19:33

标签: 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 = new mysqli(DB_SERVER, DB_USER, DB_PASS, D_NAME);
        if ($this->db->connect_error) {
            $this->error = $this->db->connect_error;
        }
    }

}

“D_NAME”错误,因此出现错误,但我没有杀死该页面,错误后内容仍然显示。为什么?谢谢!

1 个答案:

答案 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,这意味着您不能直接访问此属性。因此,您应该通过以下方式之一访问(至少)

  • 公开;
  • 实施__get__isset魔术方法;
  • 实施一个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;

使用__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;
}