2013-06-01 33 views
0

我在php中很新穎! 我想爲我的小cms的導航創建一個類。 它除了一件事情正常工作:所有的頁面和子頁面顯示不是一次,因爲它應該是但是兩次.. 請你幫助我!Php:重複導航2次

這是我如何調用類:

<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

你掉進PHP的一些奇怪的傳統行爲。在PHP 5之前,類名稱與名稱完全相同的方法被認爲是構造函數。這是因爲向後兼容。

結果是導航()執行兩次:一次創建時,再次在不同的調用。重命名類或方法來解決它。

更多關於構造函數和析構函數可以在這裏找到:http://php.net/manual/en/language.oop5.decon.php

1

因爲在你的類第一種方法具有相同的名稱作爲類,它是自動在類實例化時運行。這就是所謂的constructor,這就意味着你不需要調用$navigation_object->navigation();

對於向後兼容性,如果PHP 5中找不到__construct() 功能給定類,類沒有繼承一個從一個 父類,它將按類的名稱搜索舊式構造函數 。

+0

非常感謝您! 不僅我解決了這個問題,而且我終於明白它是如何工作的__construct! 謝謝亞當! – johnnyfittizio

1

它,因爲你的navigation()功能被命名爲與您的類(navigation)。

在舊的PHP中,這意味着navigation()函數充當構造函數,它會在您創建對象的新實例時自動調用。

刪除以下行:

$navigation_object->navigation(); 

或更改navigation()方法的名稱和調用,而不是