PHP include/require 内部函数

问题描述 投票:0回答:4

如果函数非常大,并且每次加载页面时都会加载,那么最好编写

function foo(){ include(.../file_with_function's_code); return; }
来最小化函数脚本的大小吗?或者这并不重要,因为当加载(但未执行)函数时,即使内容包含在包含中,也会加载内容?谢谢你。

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

php function optimization include require
4个回答
25
投票

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

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

<?php
echo "Testing...";

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

结果:

如果我打电话

doThing();
我会收到文件未找到警告。

如果我注释掉

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


12
投票

PHP 8 更新:

正如 @ciscoheat 指出的那样,

__autoload
从 v7.2 中已弃用,并从 v8.0 中完全删除。使用
spl_autoload_register
代替:

spl_autoload_register(function($class_name) {
  include $class_name. '.php';
});

参见 https://www.php.net/manual/en/function.spl-autoload-register.php

虽然您只能拥有一个

__autoload
函数,但您可以多次调用
spl_autoload_register


或者,作为一个不错的选择,将函数封装在类中,并利用

__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
将加载文件,但不会在此之前。


6
投票

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

如果包含发生在调用文件的函数内部,则 被调用文件中包含的所有代码的行为就像它一样 已在该函数内定义。所以,它将跟随变量 该函数的范围。

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


3
投票

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

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

  • 每次调用该函数时,都会执行包含代码路径。 编译相同的代码数百次是一个坏主意。

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

所以不要,除非你知道自己在做什么。 使用 Albatrosz 描述的技术。 顺便说一句,他的

__autoload()
函数只是一种有效的异常示例。

© www.soinside.com 2019 - 2024. All rights reserved.