我已经编写了多年的程序性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包含在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>";
}
?>
如您所见,上面的脚本调用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时,该变量已经或者应该被定义,之前已经完成了这个变量,如果是index.php则被称为top.php
由于
答案 0 :(得分:1)
在脚本顶部添加
$menu = new Menu($dbHandle);
答案 1 :(得分:1)
这不是班级的工作方式。您无法使用变量Menu
引用整个类$Menu
来调用实例方法。
您需要创建一个类的实例来调用方法:
$menu = new Menu(...);
您可以创建在类本身上调用的类级“静态”方法,但该语法不涉及$Menu
。您可以使用Menu::method_name()
。
答案 2 :(得分:0)
您正在拨打$ Menu-&gt; 所以你是一个名为Menu的变量,而不是类Menu。 无论如何,该函数不是静态的,因此您需要实例化一个对象。
为此,添加一行:
$menu = new Menu($db);
其中$ db是你的数据库对象,如果你真的需要它,或者如果你不这样做是null(我不能用那个代码片段说)
然后致电
$menu->menuFramework(...)