在PHP中使用对象时收到此致命错误:
在非对象
上调用成员函数query()
的index.php:
$db = new PDO("mysql:host=localhost;dbname=world;charset=utf8", "root", "xxx");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn = new Connection($db);
$data = $conn->getCities();
foreach ($data as $row) {
print_r($row);
}
connection.php:
class Connection {
protected $db;
public function _construct(PDO $db) {
$this->db = $db;
}
public function getCities() {
return $this->db->query("SELECT * FROM city"); \\ Error here
}
}
在单个文件中,它可以正常工作:
$db = new PDO("mysql:host=localhost;dbname=world;charset=utf8", "root", "xxx");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$data = $db->query("SELECT * FROM city");
foreach($data as $row) {
print_r($row);
}
对于我不理解的面向对象是什么,还是有另一个原因?
答案 0 :(得分:3)
如果您的代码段是复制/粘贴并且完全准确,那么构造函数中可能会有一个非常简单的拼写错误。在PHP中,它们必须以连续的两个下划线开头,而您的代码只有一个:
class Connection {
public function _construct(PDO $db) {
$this->db = $db;
}
}
应该成为
class Connection {
public function __construct(PDO $db) {
$this->db = $db;
}
}
解释如下:您现有的代码不包含语法错误甚至语义错误。只有一个名为_construct
的方法永远不会被调用。在创建新对象时,正在构造对象,传入一个永远被忽略的从未使用的$db
。