【问题标题】:How to use include within a function?如何在函数中使用包含?
【发布时间】:2011-02-06 20:30:30
【问题描述】:

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

【问题讨论】:

    标签: php function include


    【解决方案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
    }
    

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

    【讨论】:

      【解决方案2】:

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

      您的基本假设是错误的。这种优化适得其反;即使您的函数长达数百行,将其隐藏在 PHP 的解析器中也没有明显的好处。 PHP 解析文件的成本可以忽略不计;真正的显着速度提升来自于找到更好的算法或更好的方式与您的数据库对话。

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

      一个例子:

      file1.php

      function test() {
      
      }
      

      index.php

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

      【讨论】:

      • 该函数将近 1000 行,是从我的 session.php 中调用的,所以每个 ajax 请求都会加载无用的代码,除了它被使用的几次。我还应该按照您的第一段加载它吗?
      • 我刚刚在我的 apache 服务器上运行了一个迷你基准测试,声明一个 1000 行的函数花了 PHP 0.000008 秒。我不想提倡编写一个有 1000 行的函数,但我会说在不影响性能的情况下包含该函数是非常安全的。要执行我使用的基准测试: $time = microtime(true); # # 代码在这里进行基准测试 # echo "

        Time elapsed: ",microtime(true) - $time, " seconds";

      【解决方案3】:

      您好,我解决了问题

      //connect.php
      
      
      $connect ="OK";
      

      include "connect.php";
      
      show($connect);
      
      function show($connect){
      
      
      echo $connect;
      
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-06
        相关资源
        最近更新 更多