一尘不染

如何在函数内使用include?

php

我有一个很大的功能,希望仅在需要时才加载。因此,我认为使用include是必经之路。但是我也需要几个支持功能-仅在go_do_it()中使用。

如果它们在包含的文件中,则会出现重新声明错误。参见示例A

如果将支持功能放在include_once中,则可以正常工作,请参见示例B。

如果我对func_1代码使用include_once,则第二次调用将失败。

我对为什么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';
}
?>

阅读 886

收藏
2020-05-29

共1个答案

一尘不染

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
}

如果要采用延迟加载的方式(顺便说一下,这可能会导致操作码缓存问题),请改用自动加载。

2020-05-29