如果函数非常大,并且每次加载页面时都会加载,那么最好编写
function foo(){ include(.../file_with_function's_code); return; }
来最小化函数脚本的大小吗?或者这并不重要,因为当加载(但未执行)函数时,即使内容包含在包含中,也会加载内容?谢谢你。
(编辑:我的问题不是是否可能)
虽然@Luceos 的答案在技术上是正确的(最好的正确方式),但它没有回答您提出的问题,即做得更好,还是无论函数调用如何,都会发生包含?
我用最基本的方式测试了这个(OP,你为什么不呢?):
<?php
echo "Testing...";
function doThing() {
include nonExistantFile.php;
}
//doThing();
echo "Done testing.";
结果:
如果我打电话
doThing();
我会收到文件未找到警告。
如果我注释掉
doThing();
...就没有错误!因此,您可以通过这样做来节省文件加载时间。
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
将加载文件,但不会在此之前。
是的,这是可能的;请参阅 http://www.php.net/manual/en/function.include.php
如果包含发生在调用文件的函数内部,则 被调用文件中包含的所有代码的行为就像它一样 已在该函数内定义。所以,它将跟随变量 该函数的范围。
问题是,为什么不将周围的函数定义添加到该包含文件中。我认为包含在函数中的唯一可行的原因是将函数中的代码分割成位。
Luceos'和Albatrosz都可能被误读,所以我觉得我应该澄清这些。
include 指令集生成一个 runtime ZEND_INCLUDE_OR_EVAL 操作,该操作调用 Zend 编译器来编译引用的文件。 因此,一般来说,您不应该在函数中嵌入 include 语句,如下所示:
每次调用该函数时,都会执行包含代码路径。 编译相同的代码数百次是一个坏主意。
如果代码包含全局范围的元素(例如函数或类声明),那么执行该声明甚至两次都会导致编译器错误。
所以不要,除非你知道自己在做什么。 使用 Albatrosz 描述的技术。 顺便说一句,他的
__autoload()
函数只是一种有效的异常示例。