Подтвердить что ты не робот

PHP - функция внутри функции. Хорошо или плохо?

Я хотел бы знать, хорошо ли определять функцию внутри другой функции в PHP. Разве не лучше определить его перед функцией (а не внутри) с точки зрения характеристик.

4b9b3361

Ответ 1

Думаю, вам стоит больше заботиться о материнстве и о производительности, особенно в такой ситуации, где разница в производительности, вероятно, не такая большая между двумя решениями, в то время как разница в важности важна.

Как сказал Дональд Кнут:

Мы должны забыть о небольших эффективности, скажем, около 97% время: преждевременная оптимизация - это корень всего зла.

Это правда, в этой ситуации: -)

Ответ 2

Существует несколько причин:

  • Документация внутренней функции не будет анализироваться.
  • Внутренняя функция существует только после того, как внешняя функция была вызвана (но даже вне области внешней функции впоследствии)
  • Трудно читать (потому что его обычно не видно)
  • Единственное преимущество, о котором я мог думать, это определить обратный вызов, но это лучше сделать с помощью create_function() (<PHP 5.3) или closures (>=PHP5.3)
  • Если вас беспокоит производительность на этом уровне, вы действительно должны использовать другой язык

Ответ 3

Это плохая практика. Не только все странные вещи могут произойти, и вы потеряете слишком много времени, пытаясь отладить его, но и код становится более запутанным.

С точки зрения производительности я не совсем уверен в этом. Все, что я знаю, это то, что если вы определяете функцию внутри другой, эта последняя функция будет существовать только при вызове внешнего. Это может облегчить некоторую память. Но я считаю, что выигрыш не имеет значения.

Очень распространенный способ - определить функцию вне этой функции и вызвать ее внутри.

Ответ 4

Это зависит от ситуации, поскольку это может быть более желательно, чем использование create_function(). Однако вы должны знать, что функция, созданная внутри функции, является глобальной по объему.

function creator() {

    function inside() {

        echo "hi.";
    }
}

creator();
inside();

Это напечатает "привет". даже если функция inside() была создана "внутри" функции creator. Поэтому, если у вас есть функция в цикле, которая создает функцию, вам нужно проверить, существует ли функция, иначе она вызовет ошибку function exists после первого цикла.