Вызов функции через себя (рекурсия) не работает через автозагрузчик SPL - PullRequest
0 голосов
/ 25 января 2012

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

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

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

Например, эта функция из 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 Ответ

0 голосов
/ 25 января 2012

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

class tools {

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

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

...