调用类方法时php未定义变量错误
我已经编写过程化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未定义变量错误,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
//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两者都不一样。是的,没错,我的眼睛有毛病,我甚至戴过眼镜