【问题标题】:PHP import functionsPHP 导入函数
【发布时间】:2011-01-28 07:07:18
【问题描述】:

我正在努力寻找最实用的方法来动态导入函数...让我解释一下。

假设我有一个名为 functions 的目录,其中包含以下文件:

array_select.func.php
stat_mediam.func.php
stat_mean.func.php
.....

我想:加载每个单独的文件(其中定义了一个函数)并像使用内部 php 函数一样使用它。例如 array_pop()、array_shift() 等。

有一次我偶然发现了一个将用户定义的函数编译为 PHP 安装的一部分的教程(我现在找不到了)。虽然这不是一个很好的解决方案,因为在共享/经销商托管上你不能重新编译PHP 安装。

我不想与 PHP 的未来版本/其他扩展发生冲突,即如果我命名为 X 的函数突然成为内部 php 函数的一部分(即使它本身可能没有相同的功能)我不希望 PHP 因此抛出一个致命错误并惨遭失败。

所以我能想到的最好的方法是检查是否定义了函数,使用 function_exists(),如果是,则抛出一个通知以便在日志文件中轻松跟踪,否则定义函数。然而,这可能会转化为在我需要这样一个函数的其他文件中有很多包含/要求语句,我不太喜欢。或者可能,读取目录并遍历每个 *.func.php 文件和 include_once。虽然我觉得这有点难看。

问题是,你有没有偶然发现一些处理这种情况的源代码?它是如何实施的?你做过类似的事情吗?我需要尽可能多的想法! :)

【问题讨论】:

  • 一个类不能做的任何特殊原因?动态加载每个单独的函数会更慢且更难维护,也许不是那么实用。
  • 为了维护能力,我可能最终会这样做。
  • 考虑到这个问题没有太多答案(我并不感到惊讶),我会看看我能想出什么来满足速度/可维护性/实用性。如果我确实找到了满足这一点的解决方案,我会回来并在这里发布;)

标签: php function include requirements


【解决方案1】:

您可以完成这样的事情的一种方法是将这些函数放入类中,然后设置一个__autoload 函数。如果您反对将函数包装在类中,那么此解决方案可能不适用于您。我个人喜欢它,因为它允许我命名我的函数并在它们之间共享私有方法。

首先,您设置与此类似的自动加载功能。您需要调整命名约定以适合您自己的风格,并且可能会引入一些错误处理,但这只是为了了解基本概念。

function __autoload($class_name){
     require_once(strtolower("library/$class_name.class.php"));
}

然后,无论范围如何,您都可以在代码中的任何位置执行此类操作。

arrayFunctions::doStuff($myArray);

PHP 将自动尝试包含“library/arrayFunctions.class.php”并在 arrayFunctions 类中查找名为“doStuff”的方法。

【讨论】:

  • 这可能是实现它的一种方式。虽然为什么我应该有一个只有一个静态方法的类?我知道,我很难取悦。实际上,我想知道是否可以将参数传递给 __construct() 并直接从 __construct() 获取返回值。类似于调用 __toString();当您尝试回显对象时。
  • Re “虽然我为什么要创建一个只有一个静态方法的类?”您可以(并且应该!)在类中放置多个方法。从组织的角度来看,它很棒,因为你基本上是这样对你的职能进行分类的。
【解决方案2】:

我对这个想法有意见。在降低每秒最大可能请求数方面,访问文件系统以包含单个函数非常昂贵。

通常在一个文件(静态类?)中加载/解析五个函数并只使用其中两个(一个 stat 调用)比为两个函数加载两个文件(两个 stat 调用)要好得多。

当您需要所有五个功能时,显然会变得更糟。

【讨论】:

  • 仅当您为每个类编写一个函数时,我会认为这是对类的滥用。
  • 好吧,我不明白为什么你应该有一个包含所有类的文件,然后使用自动加载。那么为什么不首先使用 include/require 呢?
  • 几个原因。第一,因为 include/require 是执行堆栈中第一个脚本的上下文,这可能导致各种巫术来获取正确的文件路径。此外,__autoload() 消除了使用requirerequire_once 所涉及的所有问题。还有其他原因,但这两个就足够了。这些都意味着您可以有效地进行延迟加载,而不会因不必要的贪婪加载而使系统负担过重。
【解决方案3】:
  1. 要在需要时自动加载内容,请将您的函数放入类中并使用自动加载。
  2. 对于名称冲突,请使用命名空间(如果您有 PHP 5.3)。

【讨论】:

    猜你喜欢
    • 2019-01-03
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    相关资源
    最近更新 更多