2013-08-06 3 views
1

Я пытаюсь сделать собственный класс в CodeIgniter, и поэтому я сделал файл в папкесоздание собственных классов в ДИ

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. Единственное, о чем я сейчас думаю, - это хранить массив массивов hardcoded (еще не использовать базу данных) – 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

Не беспокойтесь. Удачи. Я настоятельно рекомендую вам прочитать в документах ref, если вы не слишком хорошо знакомы с ООП в PHP. – Ben

Смежные вопросы