У меня есть большая функция, которую я хочу загрузить только, когда она необходима. Таким образом, я предполагаю, что использование включает, способ пойти. Но мне нужны несколько функций поддержки также - только используемый в 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
}
Если вы хотите пойти по пути ленивой загрузки (которая, кстати, может иметь код операции проблемы с кешем) вместо этого используйте автозагрузку.
У меня есть большая функция, которую я хочу загружать только тогда, когда она нужна. Поэтому я предполагаю, что использование include - это лучший способ.
Ваше базовое предположение неверно. Такая оптимизация контрпродуктивна; даже если ваша функция состоит из сотен строк, скрытие ее от синтаксического анализатора PHP не принесет заметных преимуществ. Стоимость синтаксического анализа файла для PHP незначительна; реальный заметный прирост скорости связан с поиском лучших алгоритмов или лучшими способами взаимодействия с вашей базой данных.
Тем не менее, вы должны включить определение функции во включаемый файл. Вместо того, чтобы перемещать тело функции в func_1.php
, переместите всю функцию в файл.Затем вы можете require_once
файл, содержащий функцию внутри каждого файла, где она вам нужна, и быть уверенным, что она включается ровно один раз, независимо от того, сколько раз вы пытаетесь ее включить.
Пример:
function test() {
}
require_once('file1.php');
include('table_of_contents.php');
test();