Как использовать включить в функцию? - PullRequest
15 голосов
/ 12 апреля 2010

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

Если они находятся во включенном файле, я получаю ошибку redeclare. Смотрите пример 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';
}
?>

Пример Б:

<?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';
}
?>

Ответы [ 3 ]

19 голосов
/ 12 апреля 2010

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

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

15 голосов
/ 12 апреля 2010

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

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

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

Пример:

file1.php

function test() {

}

index.php

require_once('file1.php');

include('table_of_contents.php');
test();
1 голос
/ 05 октября 2018

Привет, я решил проблему

//connect.php


$connect ="OK";

и

include "connect.php";

show($connect);

function show($connect){


echo $connect;


}
...