【问题标题】:PHP include/require inside functionsPHP include/require 内部函数
【发布时间】:2014-03-02 10:03:24
【问题描述】:

拥有相当大的函数并且每次加载页面时都会加载,最好写function foo(){ include(.../file_with_function's_code); return; }以最小化函数脚本的大小?或者这并不重要,因为当一个函数被加载(但未执行)时,即使它包含在一个包含中,也会加载内容?谢谢。

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

【问题讨论】:

    标签: php function optimization include require


    【解决方案1】:

    虽然@Luceos 的答案在技术上是正确的(最好的正确方法),但它并没有回答您提出的问题,即做得更好,或者无论函数调用如何都包含发生?

    我以最基本的方式对此进行了测试(OP,你为什么不呢?):

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

    结果:

    如果我打电话给doThing();,我会收到未找到文件的警告。

    如果我注释掉doThing();... 没有错误!因此,您可以通过这样做来节省文件加载时间。

    【讨论】:

    • 好问题“你为什么不呢?”,我真的没有想到那个明显的测试!非常感谢!
    【解决方案2】:

    或者,作为一个不错的选择,将您的函数封装在类中,并利用__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】:

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

    如果包含出现在调用文件的函数内部,则 被调用文件中包含的所有代码都会表现得好像 已在该函数中定义。所以,它将跟随变量 该功能的范围。

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

    【讨论】:

    • 是的,我知道这是可能的。我的问题是关于优化。在函数内部编写一个包含以使其更小会更好吗? (具有相当大的功能,并且每次加载页面时都会加载)。谢谢。
    【解决方案4】:

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

    include 指令集生成一个runtime ZEND_INCLUDE_OR_EVAL 操作,该操作调用Zend 编译器来编译引用的文件。因此,一般而言,您不应在函数中嵌入 include 语句,例如:

    • 每次调用函数时采用该代码路径时都会执行包含。将同一段代码编译 100 次是个坏主意。

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-25
    • 2016-07-03
    • 2017-05-07
    • 1970-01-01
    • 2016-11-15
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多