【问题标题】:Call function through self (recursion) doesnt works via SPL auto loader通过自我(递归)调用函数不能通过 SPL 自动加载器工作
【发布时间】:2012-01-25 02:30:40
【问题描述】:

当我在没有递归的情况下调用任何函数时(类由 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) 时。

【问题讨论】:

  • 代码!!发布您的代码,否则我们无法帮助您
  • php.net上有很多功能。事实上,所有这些。发布您正在使用但不起作用的代码
  • 自动加载器是什么意思?发布您的代码。你在做什么,你在期待什么,正在发生什么?
  • 对不起。但我知道代码有效,它在抽象类 class::function() 中不起作用;

标签: php recursion spl


【解决方案1】:

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

class tools {

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

您已经将该函数打包到一个类中,自动加载器甚至可以找到它。但是您没有调整递归调用。如果您不使用tools::r_implode 进行递归,那么PHP 将找不到该函数。静态方法需要显式命名(带有class:: 前缀)。在那里保留简单的函数名称是行不通的。

【讨论】:

    猜你喜欢
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多