Вложенность PHP-функций: с какой целью? - PullRequest
6 голосов
/ 15 ноября 2010

Почему PHP разрешает вложенные функции?

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

.. действительный PHP.

Но:

  1. Зачем было бы необходимо вложение?
  2. И даже если это так, почему я могу вызывать bar из любого места (а не, например, только с помощью foo () или с помощью foo.bar () или чего-то подобного).

Я столкнулся с этим сегодня, потому что где-то забыл закрывающую скобку, и у меня было слишком много вниз. Код был действителен и ошибок не было; но все начало действовать действительно странно. Функции не объявляются, обратные вызовы приходят в бешенство и так далее. Это особенность, и если да, то с какой целью? Или какая-то особенность?

ОТВЕТ : комментатор указывает, что это дубликат из Что такое вложенные функции php для .

Ответы [ 2 ]

7 голосов
/ 15 ноября 2010

Обратите внимание, что порядок важен здесь; Вы не можете вызвать bar () перед вызовом foo () в вашем примере. Логика здесь заключается в том, что выполнение foo () определяет bar () и помещает его в глобальную область видимости, но оно не определено до выполнения foo () из-за области видимости.

Использование здесь будет примитивной формой перегрузки функций; ваша функция bar () может выполнять различные операции в зависимости от того, какая версия foo () объявляет ее, при условии, конечно, что каждая отдельная версия foo () действительно определяет функцию bar ().

6 голосов
/ 15 ноября 2010

В PHP вы можете определять функции, константы времени выполнения и даже классы условно. Это позволяет вам определять различные функции / константы / классы в зависимости от обстоятельств.

Простой пример: определите функцию String\Length в зависимости от того, включена или отключена многобайтовая поддержка в вашем приложении.

namespace String;

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

Вложенные функции являются лишь частным случаем определения условных функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...