我是php的新手! 我想创建一个用于导航我的小cms的类。 它可以正常工作,除了一件事:所有页面和子页面都不会显示一次,因为它应该是两次... 你能帮帮我吗?
这就是我打电话给班级的方式:
<div id="nav">
<ul class="navigation">
<?php
$navigation_object = new Navigation();
$navigation_object->navigation();
?>
</ul>
</div>
这是班级:
class Navigation {
var $nav_set;
var $nav;
var $selected_nav;
var $page_set;
var $page;
var $selected_page;
public $output = NULL;
public function navigation() {
//_____________________________ NAV _____________________________
// 3. Performing database query for table NAV
$get_all_nav_object2 = new Get_all_nav();
$this->nav_set = $get_all_nav_object2->get_all_nav_function();
// 4. Using returned data for table NAV (in variable $nav_set)
while ($this->nav = mysql_fetch_array($this->nav_set)) {
$output = "<li";
if ($this->nav["id"] == $this->selected_nav['id']) {
$output .= " class=\"selected\"";
}
$output .= "><a href=\"content.php?nav_id=" . urlencode($this->nav["id"]) .
"\">{$this->nav["nav_name"]}</a></li>";
// _____________________________ PAGES _______________________________________
// 3b. Performing database query for table PAGES (sub-navigation)
$get_pages_object1 = new Get_pages_for_nav();
$this->page_set = $get_pages_object1->get_pages_for_nav_function($this->nav["id"]);
$output .= "<ul class=\"sub_navigation\">";
// 4b. Using returned data for table PAGES (in variable $page_set)
while ($this->page = mysql_fetch_array($this->page_set)) {
$output .= "<li";
if ($this->page["id"] == $this->selected_page['id']) {
$output .= " class=\"selected\"";
}
$output .= "><a href=\"content.php?page_id=" . urlencode($this->page["id"]) .
"\">{$this->page["page_name"]}</a></li>";
}
$output .= "</ul>"; //closing ul for sub_navigation
echo $output;
} // END of the previous while: while ($nav = mysql_fetch_array($nav_set))
} // end function
} // end class
答案 0 :(得分:1)
因为类中的第一个方法与类具有相同的名称,所以在实例化类时会自动运行它。这称为constructor,表示您无需致电$navigation_object->navigation();
为了向后兼容,如果PHP 5找不到__construct() 给定类的函数,并且该类没有从a继承 父类,它将搜索旧式构造函数, 通过班级的名字。
答案 1 :(得分:1)
这是因为您的navigation()
函数的名称与您的类(navigation
)相同。
在旧的PHP中,这意味着navigation()
函数充当构造函数,只要您创建对象的新实例,就会自动调用它。
删除以下行:
$navigation_object->navigation();
或者更改navigation()
方法的名称并改为调用
答案 2 :(得分:0)
你陷入了一些奇怪的遗留行为的PHP。在PHP 5之前,与类具有完全相同名称的类方法被认为是构造函数。这是由于向后兼容性而保留的。
结果是导航()执行了两次:一次创建,再次执行不同的调用。重命名类或方法来解决它。
有关构造函数和析构函数的更多信息,请访问:http://php.net/manual/en/language.oop5.decon.php