公共功能内部的功能?

时间:2011-10-26 02:50:12

标签: php class function

class ea_framework {

    public function outer() {

        function inner() {

        }

    }

}

这似乎不可能?

我是PHP类的新手,任何建议都会受到赞赏!

这是我的测试用例:

# Site Class
class ea_framework {

    public function __construct() {
        $this->init();
    }

    public function init() {
        $this->header();            
    }

    public function header() {

        function head_start() {

            # Doctype
            echo "<!DOCTYPE html>\n";
            # Begin HTML
            echo "<html class='".agent()."'>\n";
            # Begin HEAD
            echo "<head>\n";

        }

        $this->head_start();

    }

}

$bro = new ea_framework();

错误:

Fatal error: Call to undefined method ea_framework::head_start() in /home/tfbox/domains/ibrogram.com/public_html/i/construction/core/run.php on line 31

3 个答案:

答案 0 :(得分:3)

如果您使用的是PHP 5.3或更高版本,则可以尝试

$inner = function() { ... }
...
$inner();

答案 1 :(得分:2)

works for me in PHP 5.2.5 and in PHP 5.2.11

manual没有说明任何值得注意的版本要求,所以我希望这适用于任何PHP5版本 - 也许也可能是PHP4后期版本。


<强>更新

您的测试用例稍有破坏,因为您的内部函数是您班级的成员,但您正试图将其称为。<​​/ p>

内部函数实际上变成了全局函数(如果你多次调用外部函数,你将得到重定义错误!)。

  

PHP中的所有函数和类都具有全局范围 - 即使它们是在内部定义的,也可以在函数外部调用它们,反之亦然。

所以,我建议不要这样做。

如果你真的想要这个,请拨打$head_start(),而不是$this->head_start()

答案 2 :(得分:2)

它工作正常,但不是很有用。

PHP将在第一次调用时执行outer()。在里面,它将找到函数inner()的函数声明,它将解析它。现在您可以使用全局函数inner了。注意,该函数不是类的一部分,它只是一个常规的全局函数。如果再次调用outer(),PHP将再次遇到名为inner的函数的函数声明,并将停止执行,抱怨你can't redeclare function inner on line ...

因此,虽然它有效(取决于你想要达到的目的),但它并不是一个非常有用的模式。