2014-02-05 4 views
9

Имея функции, которые являются довольно большими и они загружаются каждый раз, когда страница загружается, было бы лучше написать function foo(){ include(.../file_with_function's_code); return; }, чтобы свести к минимуму размер скрипта функций? Или это не имеет значения, потому что когда функция загружается (но не выполняется), также загружается контент, даже если он включен в include? Спасибо.PHP include/require in functions

(Edit: мой вопрос не о том, если это возможно или нет)

ответ

17

Хотя ответ @Luceos является технически корректным (лучший вид правильного), он не отвечает на заданный вами вопрос, а именно делает это лучше или включает в себя события независимо от вызовов функций?

Я испытал это в наиболее простой форме (OP, почему не ты?):

<?php 
echo "Testing..."; 

function doThing() { 
    include nonExistantFile.php; 
} 
//doThing(); 
echo "Done testing."; 

Результаты:

, если я позвоню doThing(); я получаю файл не найден предупреждение.

Если я прокомментирую doThing(); ... ошибок не будет! Таким образом, вы можете сохранить время загрузки файла, выполнив это.

+7

Хороший вопрос «почему ты не сделал?», Я действительно не думал об этом очевидном тесте! Большое спасибо! – Albatrosz

4

Да, это возможно; см http://www.php.net/manual/en/function.include.php

Если включить происходит внутри функции в вызывающем файле, то весь код, содержащийся в вызываемом файле будет вести себя так, как будто она была определена внутри этой функции. Таким образом, он будет следовать за переменной области действия этой функции.

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

+0

Да, разделив код на повторное использование ... –

+0

Да, я знаю, что это возможно. Мой вопрос об оптимизации. Было бы лучше написать include внутри функции, чтобы сделать ее меньшей? (Имея достаточно большие функции, и они загружаются каждый раз, когда страница загружается). Спасибо. – Albatrosz

11

Или, как хорошая альтернатива, инкапсулировать свои функции в классах, а также принять преимущество __autoload:

function __autoload($class_name) { 
    include $class_name . '.php'; 
} 

Encapsulate myBigFunction() в классе

class myBigFunction { 
    public static function run() { 
    //the old code goes here 
    } 
} 

сохранить его как myBigFunction.php

Когда вы вызываете функцию как статический метод в классе:

myBigFunction::run() 

__autoload загрузит файл, но не раньше этого.

+2

Это, безусловно, путь. Разделение функций на отдельные файлы вызовет много лишней путаницы, и многие мелкие файлы могут сделать это менее эффективным. С другой стороны, группировка функций в осмысленные классы помогает организовать ваш код и поддерживать его по мере его роста. – IMSoP

+3

Я по-прежнему не использую классы, но я архивирую ваше предложение, чтобы проверить его! Большое спасибо!! – Albatrosz

2

И LuceosAlbatrosz могут быть неверно истолкованы, поэтому я почувствовал, что должен их прояснить.

включает набор директив генерировать выполненияZEND_INCLUDE_OR_EVAL операцию, которая вызывает компилятор Zend для компиляции указанного файла.Таким образом, в общем, вы не должны встраивать включают заявления в функции, как:

  • включаемой будет выполняться каждый раз, когда этот путь код берется, когда функция вызывается. Компиляция одного и того же фрагмента кода 100 раз - плохая идея.

  • Если код содержит элементы глобальной области видимости (например, функции или объявления класса), то выполнение этого объявления даже дважды приведет к ошибкам компилятора.

Так не, если вы не знаете, что вы делаете. Использовать такие методы, как те, которые описаны Альбатросом. Кстати, его функция __autoload() - это всего лишь пример исключения, если это действительно так.

+0

Спасибо за ответ! – Albatrosz

+0

Больше нет. Функция__autoload() УДАЛЯЕТСЯ с PHP 7.2.0: http://php.net/manual/en/function.autoload.php –