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


php undefined variable error when calling class method

我多年来一直在编写过程php,对它非常熟悉。最近我决定重新修改现有的网站,并改用PDO和OOP。每个人都告诉我这是一条更好的路,但学习曲线正在扼杀我。

菜单生成器

vbls:5 1

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

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

过程是,在包含以下脚本之前,我在index.php的顶部包含了menu.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>";
}
?>

正如您所看到的,上面的脚本调用Menu类中的一个方法:

<?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.php时,变量已经或应该被定义,这在之前被称为顶部if index.php

感谢

将其添加到脚本的顶部

$menu = new Menu($dbHandle);

类不是这样工作的。不能用变量$Menu引用整个类Menu来调用实例方法。

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

$menu = new Menu(...);

您可以创建在类本身上调用的类级"静态"方法,但该语法不涉及$Menu。您可以使用Menu::method_name()

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

为此,添加一行:

 $menu = new Menu($db);

如果你真的需要,$db是你的数据库对象,如果你不需要,则为null(我不能用那个代码片段)

然后呼叫

$menu->menuFramework(...)