irc*_*ell 61
函数没有函数自动加载器.你有四个现实的解决方案:
将所有函数包装到命名空间类中(适合上下文).所以假设你有一个叫做的函数string_get_letters.您可以将其添加到称为StringFunctions静态函数的类中.所以不要打电话string_get_letters(),而是打电话StringFunctions::get_letters().然后你会__autoload那些命名空间的类.
预加载所有功能.由于您正在使用类,因此您不应该使用那么多函数,因此只需预加载它们即可.
在使用之前加载函数.在每个文件中,require_once将在该文件中使用的函数文件.
首先不要使用功能.如果你正在开发OOP代码(无论如何你似乎都是这样),根本不需要函数.您需要一个功能(或多个)的所有东西,您可以以OO方式构建并避免需要功能.
就个人而言,根据您的确切需求以及代码库的质量和大小,我建议使用1,2或4 ...
ivo*_*oba 34
如果您在项目中使用Composer,则可以将文件指令添加到自动加载部分.
这实际上会在自动加载器中生成require_once,但感觉就像真正的自动加载,因为你不必处理它.
虽然它不是懒惰的装载.
"autoload": {
"psr-0": { "Assetic": "src/" },
"files": [ "src/functions.php" ]
}
Run Code Online (Sandbox Code Playgroud)
Ali*_*xel 15
我读了一段关于一个丑陋的黑客,它发现了致命错误并试图包含并执行缺失的函数,但我绝对不会走那条路.
你最接近的是__call() 魔术方法,它是一种__autoload()方法,而不是函数.它可能足以满足您的需求; 如果你有能力打电话给一个班级,并分别要求每个不同的功能.从PHP 5.3.0开始,你也有__callStatic().
使用示例__callStatic():
class Test
{
public function __callStatic($m, $args)
{
if (function_exists($m) !== true)
{
if (is_file('./path/to/functions/' . $m . '.php') !== true)
{
return false;
}
require('./path/to/functions/' . $m . '.php');
}
return call_user_func_array($m, $args);
}
}
Test::functionToLoad(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
这将调用functionToLoad()./path/to/functions/functionToLoad.php中定义的函数.
好吧,像往常一样,有一个PECL扩展:
(来自:http://phk.tekwire.net/joomla/support/doc/automap.htm)
它应该自动加载函数以及类.然而,这对当前的PHP解释器不起作用.
(另一种选择btw,是生成加载和运行命名空间对应项的存根函数.)
话虽如此.自动加载并不是普遍认为的好习惯.它导致阶级等级和对象幸福感过度分裂.PHP具有自动加载的真正原因是因为包含和依赖管理系统不成熟.