PHP - Функция внутри функции. Хорошо это или плохо?
Я хотел бы знать, хорошо ли определять функцию внутри другой функции в PHP. Не лучше ли определить его перед функцией (а не внутри) с точки зрения производительности.
4 answers
Я думаю, что вам следует больше заботиться о ремонтопригодности и меньше о производительности, особенно в такой ситуации, когда разница в производительности, вероятно, не так велика между двумя решениями, в то время как разница в ремонтопригодности кажется важной.
Как сказал Дональд Кнут:
Мы должны забыть о небольшой эффективности, скажем, примерно в 97% случаев: преждевременная оптимизация - корень всего зла.
Это совершенно верно, в этом ситуация;-)
Против этого есть несколько причин:
- Документация внутренней функции не будет проанализирована.
- Внутренняя функция существует только после вызова внешней функции (но даже после этого выходит за рамки внешней функции)
- Это трудно читать (потому что это обычно не видно)
- Единственное преимущество, о котором я мог подумать, - это определение обратного вызова, но это лучше сделать с помощью
create_function()
(<PHP 5.3
) или замыкания (>=PHP5.3
) - Если вас беспокоит производительность на этом уровне, вам действительно следует использовать другой язык
Это плохая практика. Мало того, что могут произойти все странные вещи, и вы потеряете слишком много времени, пытаясь отладить его, но и код станет более запутанным.
С точки зрения производительности я не совсем уверен в этом. Все, что я знаю, это то, что если вы определите функцию внутри другой, эта последняя функция будет существовать только в том случае, если будет вызвана внешняя. Это может облегчить некоторые воспоминания. Но я считаю, что выигрыш не является значительным.
Очень распространенным способом является определение функции вне эту функцию и вызовите ее внутри.
Это зависит от ситуации, так как это может быть более желательно, чем использование create_function()
. Однако вы должны знать, что функция, созданная внутри функции, является глобальной по области действия.
function creator() {
function inside() {
echo "hi.";
}
}
creator();
inside();
Это выведет "привет". несмотря на то, что функция inside()
была создана "внутри" функции создателя. Поэтому, если у вас есть функция в цикле, которая создает функцию, вам нужно проверить, существует ли функция, иначе это вызовет ошибку function exists
после первого цикла.