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

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

4 ответа

Решение

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

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

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

Это вполне верно, в этой ситуации;-)

Есть несколько причин против этого:

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

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

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

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

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

function creator() {

    function inside() {

        echo "hi.";
    }
}

creator();
inside();

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

Другие вопросы по тегам