PHP include/require 内部函数

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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() 函数只是一个例外的例子,它是有效的。

【讨论】:

感谢您的回复! 不再。自 PHP 7.2.0 起,函数 __autoload() 已被弃用:php.net/manual/en/function.autoload.php

以上是关于PHP include/require 内部函数的主要内容,如果未能解决你的问题,请参考以下文章

PHP中include()与require()

php包含(include/require)文件时的作用域

require(),include(),require_once()和include_once()区别

require(),include(),require_once()和include_once()之间的区别

PHP文件引入

PHP中引入文件的四种方式及区别