2012-01-25 2 views
-1

Когда я вызываю любую функцию без рекурсии (класс загружается SPL) - все нормально, но если эта функция вызывает себя (рекурсия) - ничего не работает.Функция вызова через self (рекурсия) не работает через автозагрузчик SPL

Если я использую функцию без автозагрузчика - все отлично работает. Я думаю, что это происходит потому, что объект класса не существует, например, с помощью магических методов: вы должны использовать __callStatic, а не __call с абстрактным использованием класса, я пытался сделать эту функцию статической oO, но ничего не работает снова.

Любые идеи, как можно использовать рекурсию через автозагрузчик?

Например this function from php.net не работает в режиме автопогрузчика:

function r_implode($glue, $pieces) 
{ 
    foreach ($pieces as $r_pieces) 
    { 
     if (is_array($r_pieces)) 
     { 
      $r_pieces = r_implode($glue, $r_pieces); 
     } 
     else 
     { 
      $retVal[] = $r_pieces; 
     } 
    } 
    return implode($glue, $retVal); 
} 

class load 
{ 
    public static function init() 
    { 
     return spl_autoload_register(array(__CLASS__, "hook")); 
    } 
    public static function quit() 
    { 
     return spl_autoload_unregister(array(__CLASS__, "hook")); 
    } 
    public static function hook($class) 
    { 
     // echo "CLASS IS:$class<br>"; 
     $lnk=PATH . str_replace("_", "/", $class) . ".php"; 
     ob_start(); 
     require $lnk; 
     ob_end_clean(); 
     return $class; 
    } 
} 

Так что, когда я добавить функцию в класс инструментов, и вызвать tools::r_implode($a,$b); функция не работает, но когда я вставляю эту функцию в том же php и вызов r_implode($a,$b) работ.

+1

КОД !! Отправьте свой код или мы не сможем вам помочь – mowwwalker

+0

На php.net существует множество функций. Фактически, все они. Отправьте код, который вы используете, который не работает – mowwwalker

+0

Что значит автозагрузчик? ПОСЛЕ ВАШЕГО КОДА. Что вы работаете, чего вы ожидаете и что происходит? – mowwwalker

ответ

0

Из вашей опубликованной информации это неясно. Вы не описали фактическую ошибку. Но я предполагаю, ваша проблема на самом деле это:

class tools { 

    function r_implode($glue, $pieces) 
    { 
     $r_pieces = r_implode($glue, $r_pieces); 
    } 
} 

Вы собрали эту функцию в класс, а автозагрузчик может даже найти его. Но вы не адаптировали рекурсивный вызов. Если вы не используете tools::r_implode для рекурсии, то PHP не найдет эту функцию. Статические методы должны быть явно указаны (с префиксом class::). Сохранение имени простой функции там не будет работать.