Я хотел бы знать, хорошо ли определять функцию внутри другой функции в PHP. Разве не лучше определить его перед функцией (а не внутри) с точки зрения характеристик.
PHP - функция внутри функции. Хорошо или плохо?
Ответ 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
после первого цикла.