【问题标题】:Nesting PHP-functions: to what purpose?嵌套 PHP 函数:有什么目的?
【发布时间】:2011-05-10 09:11:09
【问题描述】:

为什么 PHP 允许嵌套函数?

<?php
function foo() {
    function bar() {
        return "bar";
    }
    return "foo";
}
print foo();
print bar();

.. 是有效的 PHP。

但是:

  1. 为什么永远需要嵌套?
  2. 即使是这样,为什么我可以从任何地方调用 bar(而不是,例如仅使用 foo() 或通过 foo.bar() 等)。

我今天遇到了这个问题,因为我在某处忘记了一个右括号,而且还有一个太多了。代码有效且未抛出错误;但这一切都开始变得非常奇怪。函数没有被声明,回调变得疯狂等等。 这是一个功能吗?如果是,目的是什么?还是有什么异能?

ANSWER:评论者指出这是What are php nested functions for重复

【问题讨论】:

  • 可爱。好像 PHP 需要另一个理由来引起仇恨......
  • 已经很好地覆盖了:What are php nested functions for?的可能重复
  • 另外,仅仅因为你不理解某事并不能使它成为“白痴”,顺便说一句,这不是一个词。
  • @meagar:我认为他的意思是“特质”。
  • @Ignacio 我以为他的意思是“白痴”...

标签: php nested


【解决方案1】:

注意这里的顺序很重要;在您的示例中,您不能在调用 foo() 之前调用 bar()。这里的逻辑似乎是 foo() 的执行定义了 bar() 并将其置于全局范围内,但由于作用域,它没有在 foo() 的执行之前定义。

这里使用的是函数重载的原始形式;你可以让你的 bar() 函数根据声明它的 foo() 版本执行不同的操作,当然假设每个不同版本的 foo() 确实定义了一个 bar() 函数。

【讨论】:

  • 我想知道当foo() 被第二次调用时会发生什么。有人会认为会抛出错误,因为 bar() 已经定义。
【解决方案2】:

在 PHP 中,您可以有条件地定义函数、运行时常量甚至类。这允许您根据情况定义不同的函数/常量/类。

简单示例:根据您的应用程序中是否打开或关闭多字节支持来定义String\Length 函数。

namespace String;

if (\MULTIBYTE_MODE) {
    function Length($string) {
        return strlen($string);
    }
} else {
    function Length($string) {
        return mb_strlen($string);
    }
}

嵌套函数只是条件函数定义的一种特例。

【讨论】:

    猜你喜欢
    • 2010-09-29
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2012-08-10
    • 2018-12-13
    • 2015-02-20
    • 2011-07-20
    相关资源
    最近更新 更多