调用类方法时php未定义变量错误

调用类方法时php未定义变量错误,php,class,oop,variables,undefined,Php,Class,Oop,Variables,Undefined,我已经编写过程化php多年了,对它非常熟悉。最近,我决定重做一个现有的站点,并切换到PDO和OOP。每个人都告诉我,这是一个更好的方式,但学习曲线正在扼杀我。当我尝试调用一个类时,我得到以下信息 菜单生成器 vbls:51 注意:未定义变量:第9行/home/lance/DallyPost/projectWebSite/trunk/1/core/modules/menuBuilder.php中的菜单 致命错误:在第9行的/home/lance/DallyPost/projectWebSite/t

我已经编写过程化php多年了,对它非常熟悉。最近,我决定重做一个现有的站点,并切换到PDO和OOP。每个人都告诉我,这是一个更好的方式,但学习曲线正在扼杀我。当我尝试调用一个类时,我得到以下信息

菜单生成器

vbls:51

注意:未定义变量:第9行/home/lance/DallyPost/projectWebSite/trunk/1/core/modules/menuBuilder.php中的菜单

致命错误:在第9行的/home/lance/DallyPost/projectWebSite/trunk/1/core/modules/menuBuilder.php中对非对象调用成员函数menuframew()

过程是,在包含以下脚本之前,我已将menu.php包含在index.php的顶部:

<?php
//menuBuilder.php
echo"<h2>$pageTitle</h2>";
$pub = $_URI_KEY['PUB'];
$dir = $_URI_KEY['DIRECTORY'];

echo"vbls: $pub $dir";

if($Menu->menuFramework("$pub", "$dir") === false) {
    echo"The base menu framework failed to build correctly.";
}
else{
    echo"<p>The base menu framework has been successfully constructed.</p>";
}
?>

如您所见,上面的脚本调用菜单类中的一个方法:

<?php
//menu.php
class Menu{
    private $db; 
    public function __construct($database) {
        $this->db = $database;
    }

    public function menuFramework($pub, $directory){
        $link = "/" . $directory . "/index.php/" . $pub . "/home/0/Home-Page/";
        $inc = "core/menus/" . $pub . "category.php";
        $file = "core/menus/" . $pub . "menuFramework.php";
    
        $text = "<nav class=\"top-bar\" data-topbar>";
        $text .= "<ul class=\"title-area\">";
        $text .= "<li class=\"name\">";
        $text .= "<h1><a href=\"$link\">Home Page</a></h1>";
        $text .= "</li>";
        $text .= "</ul>";
        $text .= "include($inc)";
        $text .= "</nav>";
    
        //write text to a file
        if(file_put_contents($file, $text)){
            return true;
        }
        else{
            return false;
        }
    }
    ... rest of file not shown

将此添加到脚本顶部

$menu = new Menu($dbHandle);

这不是上课的方式。不能使用变量
$Menu
引用整个类
Menu
,以调用实例方法

您需要创建类的实例,在该实例上调用方法:

$menu = new Menu(...);
您可以创建在类本身上调用的类级“静态”方法,但该语法不涉及
$Menu
。您可以使用
Menu::method\u name()
来实现此目的。

您正在调用$Menu-> 因此,您正在调用一个名为Menu的变量,而不是类Menu。 无论如何,该函数不是静态的,因此需要实例化一个对象

为此,请在此行中添加一个:

 $menu = new Menu($db);
其中$db是您的数据库对象,如果您真的需要它,或者如果您不需要它,则为null(我不能用该代码片段说)

然后打电话

$menu->menuFramework(...)

当您说“我的理解是,在我包含menu.php时,变量已经或应该已经被定义”时,我想您将解决这个问题,但您将得到许多其他问题。我建议您阅读一些关于OOP的教程,然后再阅读php中的OOP。包含类文件没有任何作用,只是告诉系统在哪里可以找到该类。但是在那之后,如果你想使用一个对象,你必须实例化它。这是有道理的,因为您可能需要多个对象,这就是为什么您要创建一个类,所以您有一种封装功能的方法您必须自动加载该类或需要一次,这样所有代码都可以在您的代码中使用$菜单=新菜单($dbHandle)$菜单不是$Menu两者都不一样。是的,没错,我的眼睛有毛病,我甚至戴过眼镜