【问题标题】:Function inside a public function?公共函数内部的函数?
【发布时间】:2011-10-26 02:50:12
【问题描述】:
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

【问题讨论】:

  • 为什么说它“似乎不可能”?当你尝试它时,你的测试用例会发生什么?你的测试用例是什么
  • 这样做的目的是什么?
  • @deceze 学习曲线。向班级介绍自己,到目前为止还没有那么好,哈哈。

标签: php class function


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    works for me in PHP 5.2.5and in PHP 5.2.11

    manual 没有说明任何值得注意的版本要求,所以我希望它可以在任何 PHP5 版本中工作——也许也可以在 PHP4 后期。


    更新

    您的测试用例略有损坏,因为您的内部函数不是您的类的成员,但您正试图这样称呼它。

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

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

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

    如果你仍然想要这个,请致电$head_start(),而不是$this-&gt;head_start()

    【讨论】:

    • 如何让它成为我班级的一员?
    • @Brogrammer:让它成为一个普通的成员函数。在 PHP 5.3+ 中,您可以将 lambda 分配给类成员变量 ($this-&gt;someMember = function() { ... }),但是……为什么!?这有点恶心,除非你真的需要关闭,否则通常不需要。
    • 所以这不是一个好方法吗?考虑到目前的班级,你会怎么做。
    • @Brogrammer:我不知道你为什么选择内部函数,或者你的目标是什么。所以我不能提出任何建议。
    • 好吧,我会放弃内部函数,只是更好地利用这些函数。谢谢。
    【解决方案3】:

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

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

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

    【讨论】:

    • 谢谢,我想这是有道理的。你会建议我做什么?
    • 只要把它变成一个普通的类方法,比如initheader。如果您不想让外部代码调用它,请将该函数设为private。或者只是把代码放在header,我不知道你为什么需要把它包装在一个函数中。
    猜你喜欢
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 2011-04-16
    • 2020-12-04
    • 2017-06-18
    • 1970-01-01
    • 2012-04-08
    • 2013-11-06
    相关资源
    最近更新 更多