Php 在子类中使用函数时,在出现null错误时调用成员函数query()

Php 在子类中使用函数时,在出现null错误时调用成员函数query(),php,class,oop,Php,Class,Oop,我有两个类,一个连接类和一个包含菜单代码的类 首先,我尝试从菜单(从数据库)中获取所有类别,因此我尝试从连接类中使用query函数。但这给了我以下错误: Fatal error</b>: Call to a member function query() on null in <b>mywebsitepath/includes/menuClass.php</b> on line <b>9</b><br /> (还没有循环

我有两个类,一个连接类和一个包含菜单代码的类

首先,我尝试从菜单(从数据库)中获取所有类别,因此我尝试从连接类中使用
query
函数。但这给了我以下错误:

Fatal error</b>:  Call to a member function query() on null in <b>mywebsitepath/includes/menuClass.php</b> on line <b>9</b><br />
(还没有循环,但首先我想消除错误)


我遗漏了什么/做错了什么?

问题是,在派生类中,使用未在任何地方定义的
$conn
,您需要使用在基类中定义的连接

$catscon = $this->db->query($cats);

您调用了连接对象属性中的变量
$db

但是在
selectCats
方法中,您使用的是不存在的
$con
。您还忘了在变量前面使用
$this->
,该变量是通知PHP在该对象和/或其父对象中查找属性所必需的

所以修改代码

<?php
require_once('includes/connection.php');
class Menu extends Connection
{
    public function selectCats()
    {
    $cats = "SELECT * FROM snm_categories WHERE published = '1'";
    $catscon = $this->db->query($cats);
    //         ^^^^^^^^^  changed here
    return $cats;
    }
}
?>

我建议您更改类结构。菜单并不是真正的“类型”连接。它使用一个连接,所以我不扩展它,我该怎么做。实例化我的菜单类上面的连接类?您会看到一个常见模式,其中连接被传递到需要使用它的任何类的构造函数中(快速搜索-)。还与依赖项注入相关联,并有助于测试。
$menu = new Menu();
$cats = $menu->selectCats();
$catscon = $this->db->query($cats);
<?php
require_once('includes/connection.php');
class Menu extends Connection
{
    public function selectCats()
    {
    $cats = "SELECT * FROM snm_categories WHERE published = '1'";
    $catscon = $this->db->query($cats);
    //         ^^^^^^^^^  changed here
    return $cats;
    }
}
?>