如何使用函数中的包含?

2022-08-30 20:50:23

我有一个大函数,我希望只在需要时加载它。因此,我认为使用包含是要走的路。但是我还需要几个支持函数 - 仅在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';
}
?>

答案 1

在函数中使用的问题是:include()

include 'file1.php';

function include2() {
  include 'file2.php';
}

file1.php将具有全局范围。的作用域是函数的局部作用域。file2.phpinclude2

现在,所有函数在作用域内都是全局的,但变量不是。我对这与.如果你真的想走这条路——老实说我不会——你可能需要借用一个旧的C/C++预处理器技巧:include_once

if (!defined(FILE1_PHP)) {
  define(FILE1_PHP, true);

  // code here
}

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


答案 2

我有一个大函数,我希望只在需要时加载它。因此,我认为使用包含是要走的路。

你的基本假设是错误的。这种优化会适得其反;即使你的函数有数百行长,从PHP的解析器中隐藏它也不会有明显的好处。PHP解析文件的成本可以忽略不计;真正显著的速度提升来自于寻找更好的算法或更好的数据库通信方式。

也就是说,您应该在包含的文件中包含函数定义。而不是将函数的主体移动到 中,而是将整个函数移动到文件中。然后,您可以在每个需要它的文件内包含函数,并确保它只包含一次,无论您尝试包含它多少次。func_1.phprequire_once

例如:

文件1.php

function test() {

}

索引.php

require_once('file1.php');

include('table_of_contents.php');
test();

推荐