PHP包含/ require内部函数

时间:2014-02-05 19:09:25

标签: php function optimization include require

如果函数非常大并且每次加载页面时都会加载,那么编写function foo(){ include(.../file_with_function's_code); return; }以最小化函数脚本的大小会更好吗?或者无关紧要,因为当一个函数被加载(但没有执行)时,即使它被包含在内,也会加载内容?谢谢。

(编辑:我的问题不在于是否可能)

4 个答案:

答案 0 :(得分:19)

虽然@Luceos答案在技术上是正确的(最好的正确),但它没有回答你提出的问题,即更好地做到这一点,还是包括无论函数调用都包含?

我用最基本的方式测试了这个(OP,为什么不是你?):

<?php
echo "Testing...";

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

结果:

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

如果我评论doThing(); ...则没有错误!因此,您可以通过执行此操作来节省文件加载时间。

答案 1 :(得分: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将加载文件,但不会加载。

答案 2 :(得分:4)

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

  

如果include发生在调用文件中的函数内,那么   调用文件中包含的所有代码都将表现得像它一样   已在该功能内定义。所以,它将遵循变量   该职能的范围。

问题是,为什么不将周围的函数定义添加到包含的文件中。我认为在函数中包含的唯一可行理由是将该函数中的代码分成位。

答案 3 :(得分:2)

Luceos'和Albatrosz都可能被误读,所以我觉得我应该澄清这些。

include 指令集生成运行时 ZEND_INCLUDE_OR_EVAL 操作,该操作调用Zend编译器来编译引用的文件。因此,一般来说, 不应 在函数中嵌入include语句,如下所示:

  • 每次在调用函数时获取代码路径时,都会执行include。编译相同的代码100次是一个坏主意。

  • 如果代码包含全局范围的元素(例如函数或类声明),那么执行该声明甚至两次都会导致编译器错误。

所以 不要 ,除非你知道自己在做什么。使用Albatrosz描述的技术。顺便提一下,他的__autoload()函数只是一个例子,它有效。