2013-08-06 73 views
1

我試圖讓自己的類笨,所以我已經在CI創建自己的類

libraries

此類稱爲

Menu

的文件夾中做了一個文件,它包含一個類來爲我的網站創建一個導航欄。這個類是像

class Menu { 

    public function draw($menu) { 
     $CI =& get_instance(); 

     $output = ''; 
     foreach ($menu as $key => $value) { 
      $output .= "<li>"; 

      if (is_array($value)) { 

       if (strpos($key, '|') !== false) { 
        $param = explode('|', $key); 
        $output .= anchor($param[1], $param[0]); 
       } else { 
        $output .= anchor('#', $key); 
       } 

       $output .= PHP_EOL."<ul>".PHP_EOL; 
       $output .= draw($value); 
       $output .= "</ul>".PHP_EOL."</li>".PHP_EOL; 
      } else { 
       $output .= anchor($key, $value, $CI->uri->slash_segment(1, 'leading') == $key ? 'class="active"' : ''); 
       $output .= "</li>".PHP_EOL; 
      } 
     } 
     return $output; 
    } 
} 

我已經庫下把這個類在我的配置文件自動加載

$autoload['libraries'] = array('menu');

當我調用類使用它,我做這個

<?php 
    $m = new Menu(); 
    echo $m->draw($menu); 
    ?> 

但不幸的是我得到這個錯誤

Fatal error: Call to undefined function draw() in /Users/username/Sites/infinity2.0/application/libraries/Menu.php on line 22

第22行是$ output。= draw($ value);

但我不知道如何解決這個問題,我認爲它是因爲再次調用自己的方法..任何幫助,歡迎和讚賞。 :)

+0

很高興您爲此創建一個庫。它讓我感覺;) –

+1

請記住,一旦你加載CI庫,你可以通過使用'$ this-> libraryName-> method();'來訪問它的方法。在這種情況下:'$ this-> menu-> draw();' –

+0

謝謝!我從CI網站的文檔中找出了它。我現在所想的只是硬編碼菜單數組的存儲位置(不要使用數據庫) – Reshad

回答

3

變化

$output .= draw($value);

$output .= $this->draw($value);

$this指當前對象,所以如果你想遞歸調用自身內部draw(),你需要用它來參考它..

你可能想閱讀來自php.net網站的解釋:http://php.net/manual/en/language.oop5.basic.php

+0

嘿謝謝!這是做的伎倆:)要標記爲正確的答案在8分鐘時,可能歡呼隊友! – Reshad

+0

不用擔心。祝你好運。如果您不太熟悉PHP中的OOP,我強烈建議您閱讀參考文檔。 – Ben