在函数内使用PHP include/require

19
拥有很大的函数,每次加载页面时都会加载它们,写 function foo(){ include(.../file_with_function's_code); return; } 来最小化函数脚本的大小是否更好?还是无所谓,因为当一个函数被加载(但未执行)时,即使它在 include 中,其内容也会被加载吗?谢谢。
4个回答

25

尽管 @Luceos 的回答在技术上是正确的(最好的正确类型),但它并没有回答你所问的问题,即这样做是否更好,或者无论如何都会发生包含?

我以最基本的方式测试了一下(楼主,你为什么不这样做呢?):

<?php
echo "Testing...";

function doThing() {
    include nonExistantFile.php;
}
//doThing();
echo "Done testing.";

结果:

如果我调用doThing();,会收到一个文件未找到的警告。

如果我注释掉doThing();,就没有错误了!所以这样做可以节省文件加载时间。


10
很好的问题,“为什么你没有这样做?”我真的没有想到那个显而易见的测试!非常感谢你! - Albatrosz

11

或者,作为一个好的替代方案,将您的函数封装在类中,并利用__autoload的好处:

function __autoload($class_name) {
    include $class_name . '.php';
}

myBigFunction() 封装在一个类中

class myBigFunction {
  public static function run() {
    //the old code goes here
  }
}

将其保存为myBigFunction.php

当您将该函数作为类的静态方法调用时:

myBigFunction::run()

__autoload会加载文件,但是只有在调用时才会加载。


3
这绝对是正确的方法。将函数拆分到单独的文件中会导致很多额外的混淆,而且许多小文件实际上可能会使性能较差。另一方面,将函数分组到有意义的类中可以帮助您组织代码,并在代码不断增长时保持其可维护性。 - IMSoP
3
我仍然没有在使用类,但我会保存您的建议以供参考!非常感谢!! - Albatrosz

6

是的,这是可能的;请参见http://www.php.net/manual/en/function.include.php

如果include发生在调用文件内的函数中,则调用文件中包含的所有代码都将表现为在该函数内定义的代码。因此,它将遵循该函数的变量作用域。

问题是,为什么不将包含文件的周围函数定义添加到其中。我认为在函数内部进行include的唯一可行原因是将该函数内的代码拆分成几个部分。


是的,我知道这是可能的。我的问题是关于优化的。为了使函数更小,将包含写在函数内部是否更好?(有些函数非常大,每次加载页面时都会加载它们)。谢谢。 - Albatrosz

3

两个链接 LuceosAlbatrosz 都可能被误读,所以我觉得我应该澄清一下。

include 指令集生成一个 运行时 ZEND_INCLUDE_OR_EVAL 操作,该操作调用 Zend 编译器编译引用的文件。因此,通常情况下,您不应该在函数中嵌入 include 语句,原因如下:

  • 每次调用函数时,都会执行 include 语句。重复编译相同的代码是一个坏主意。

  • 如果代码包含全局作用域元素(例如函数或类声明),那么即使执行该声明两次也会导致编译器错误。

因此,除非您知道自己在做什么,否则请勿这样做。使用像 Albatrosz 描述的技术。顺便说一下,他的 __autoload() 函数就是这种有效的例外情况之一。


谢谢您的回复! - Albatrosz
1
不再使用__autoload()函数,自PHP 7.2.0起已被弃用:http://php.net/manual/zh/function.autoload.php - Julio Marchi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接