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


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

Author: Roch, 2009-09-09

4 answers

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

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

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

Это совершенно верно, в этом ситуация;-)

 22
Author: Pascal MARTIN, 2009-09-09 10:29:22

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

  • Документация внутренней функции не будет проанализирована.
  • Внутренняя функция существует только после вызова внешней функции (но даже после этого выходит за рамки внешней функции)
  • Это трудно читать (потому что это обычно не видно)
  • Единственное преимущество, о котором я мог подумать, - это определение обратного вызова, но это лучше сделать с помощью create_function() (<PHP 5.3) или замыкания (>=PHP5.3)
  • Если вас беспокоит производительность на этом уровне, вам действительно следует использовать другой язык
 11
Author: soulmerge, 2009-09-09 11:06:12

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

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

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

 7
Author: rogeriopvl, 2009-09-09 10:32:36

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

function creator() {

    function inside() {

        echo "hi.";
    }
}

creator();
inside();

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

 6
Author: null, 2009-09-09 10:31:40