Как использовать, включают в функции?

У меня есть большая функция, которую я хочу загрузить только, когда она необходима. Таким образом, я предполагаю, что использование включает, способ пойти. Но мне нужны несколько функций поддержки также - только используемый в 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';
}
?>
16
задан Mahks 13 April 2010 в 02:11
поделиться

2 ответа

Проблема с использованием 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
}

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

20
ответ дан 30 November 2019 в 16:41
поделиться

У меня есть большая функция, которую я хочу загружать только тогда, когда она нужна. Поэтому я предполагаю, что использование include - это лучший способ.

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

Тем не менее, вы должны включить определение функции во включаемый файл. Вместо того, чтобы перемещать тело функции в func_1.php , переместите всю функцию в файл.Затем вы можете require_once файл, содержащий функцию внутри каждого файла, где она вам нужна, и быть уверенным, что она включается ровно один раз, независимо от того, сколько раз вы пытаетесь ее включить.

Пример:

file1.php

function test() {

}

index.php

require_once('file1.php');

include('table_of_contents.php');
test();
16
ответ дан 30 November 2019 в 16:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: