У меня есть большая функция, которую я хочу загрузить только тогда, когда это необходимо. Поэтому я предполагаю, что использование include – это путь. Но мне нужно несколько функций поддержки, а также – только в go_do_it ().
Если они находятся в включенном файле, я получаю ошибку в редизайне. См. Пример A
Если я помещаю вспомогательные функции в include_once, он отлично работает, см. Пример B.
Если я использую include_once для кода func_1, второй вызов завершается с ошибкой.
Я смущен тем, почему include_once заставляет функцию терпеть неудачу во втором вызове, кажется, что он не «видит» код второй раз, но если вложенные функции присутствуют, он «видит» их.
Пример A:
<?php /* main.php */ go_do_it(); go_do_it(); function go_do_it(){ include 'func_1.php'; } ?> <?php /* func_1.php */ echo '<br>Doing it'; nested_func() function nested_func(){ echo ' in nest'; } ?>
Пример B:
<?php /* main.php */ go_do_it(); go_do_it(); function go_do_it(){ include_once 'func_2.php'; include 'func_1.php'; } ?> <?php /* func_1.php */ echo '<br> - doing it'; nested_func(); ?> <?php /* func_2.php */ function nested_func(){ echo ' in nest'; } ?>
Проблема с использованием include()
внутри функции заключается в следующем:
include 'file1.php'; function include2() { include 'file2.php'; }
file1.php
будет иметь глобальную область. file2.php
является локальной для функции include2
.
Теперь все функции являются глобальными по объему, но переменные не являются. Я не удивлен этим беспорядком с include_once
. Если вы действительно хотите пойти этим путем – и, честно говоря, я бы этого не сделал … вам может понадобиться заимствовать старый препроцессор C / C ++:
if (!defined(FILE1_PHP)) { define(FILE1_PHP, true); // code here }
Если вы хотите пойти по пути ленивой загрузки (которая, кстати, может иметь проблемы с кешем opcode), вместо этого используйте автозагрузку.
У меня есть большая функция, которую я хочу загрузить только тогда, когда это необходимо. Поэтому я предполагаю, что использование include – это путь.
Ваше базовое предположение неверно. Такая оптимизация контрпродуктивна; даже если ваша функция составляет сотни строк, не будет заметной выгоды, чтобы скрыть ее от парсера PHP. Стоимость PHP для анализа файла незначительна; реальный заметный прирост скорости достигается за счет поиска лучших алгоритмов или из лучших способов поговорить с вашей базой данных.
Тем не менее, вы должны включить определение функции во включенный файл. Вместо того, чтобы перемещать тело функции в func_1.php
, переместите всю функцию в файл. Затем вы можете require_once
файл, содержащий функцию внутри каждого файла, где он вам нужен, и быть уверенным, что он включен ровно один раз, независимо от того, сколько раз вы пытаетесь его включить.
Пример:
function test() { }
require_once('file1.php'); include('table_of_contents.php'); test();
вrequire_once('file1.php'); include('table_of_contents.php'); test();