通过自我(递归)调用函数不适用于SPL自动加载器

时间:2012-01-25 02:30:41

标签: php recursion spl

当我调用任何没有递归的函数时(类由SPL加载) - 一切正常,但如果该函数调用自身(递归) - 没有任何作用。

如果我使用没有自动加载器的功能 - 一切都很棒。我认为发生这种情况是因为类的对象不存在,就像使用魔术方法一样:你必须使用__callStatic,而不是使用抽象使用类的__call,我试图使这个函数静态但是什么都没有用。

任何想法如何通过自动加载器使用递归?

例如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 个答案:

答案 0 :(得分:0)

根据您发布的信息,目前尚不清楚。您没有描述实际错误。但我猜测你的问题实际上是这样的:

class tools {

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

您已将该功能打包到一个类中,自动加载器甚至可以找到它。但是你没有调整递归调用。如果您不使用tools::r_implode进行递归,那么PHP将找不到该函数。静态方法需要明确命名(带class::前缀)。保持普通功能名称不起作用。