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