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 内部函数的主要内容,如果未能解决你的问题,请参考以下文章
require(),include(),require_once()和include_once()区别