2014-02-05 124 views
9

函数非常大,每载入页面时都会加载函数,最好是编写function foo(){ include(.../file_with_function's_code); return; }以最小化函数脚本的大小?或者它并不重要,因为当一个函数被加载(但不被执行)时,即使它被加载到内容中也会加载该内容?谢谢。PHP包含/需要内部函数

(编辑:我的问题不是是否有可能或没有)

回答

17

尽管@Luceos的答案在技术上是正确的(最好的一种正确答案),但它并不回答你问的问题,即做得更好,还是包括发生而不考虑函数调用?

我在最基本的方法测试了这个(OP,为什么你没有?):

<?php 
echo "Testing..."; 

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

结果:

如果我叫doThing();我收到没有找到警告的文件。

如果我评论出doThing(); ...没有错误!所以你可以通过这样做来节省文件加载时间。

+7

好问题“你为什么不?”,我真的没想到那个明显的测试!万分感谢! – Albatrosz

4

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

如果包括出现在函数内部调用文件中,然后 都包含在所谓的文件将表现得好像 在该函数中定义的代码。因此,它将遵循该函数的变量 范围。

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

+0

是拆分代码重用... –

+0

是的,我知道这是可能的。我的问题是关于优化。为了使它更小,在函数中写入include会更好吗? (具有相当大的功能,每次加载页面时都会加载)。谢谢。 – 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会加载文件,但不会在此之前。

+2

这绝对是要走的路。将函数分割成单独的文件会引起很多额外的混淆,而许多小文件实际上可能会使其性能更低。另一方面,将功能分组为有意义的类,可以帮助您组织代码并在其发展过程中对其进行维护。 – IMSoP

+3

我仍然没有使用课程,但是我将你的建议归档并检查出来!万分感谢!! – Albatrosz

2

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

包括组指令的生成运行时ZEND_INCLUDE_OR_EVAL操作其中要求了Zend编译器来编译被引用的文件。所以一般你不应嵌入包含一个函数语句,如:

  • 的包括每次当函数被调用的代码路径所用的时间将被执行。编译相同位数的代码100s是一个坏主意。

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

所以除非你知道自己在做什么。使用Albatrosz描述的技术。顺便说一下,他的__autoload()函数就是这种情况下有效的例外情况。

+0

谢谢你的回复! – Albatrosz

+0

不再。 function__autoload()从PHP 7.2.0开始被拒绝: http://php.net/manual/en/function.autoload.php –