调用非对象的成员函数查询

时间:2014-10-12 17:55:54

标签: php

在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);
}

对于我不理解的面向对象是什么,还是有另一个原因?

1 个答案:

答案 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