2010-03-16 45 views
2

我试图找到最好的实用方法来即时导入功能......让我解释一下。PHP导入功能

说我有一个名为功能目录具有以下文件:

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

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

一旦我偶然发现了一个教程(我现在再也找不到),它将用户定义函数编译为PHP安装的一部分。虽然这不是一个很好的解决方案,因为在shared/res上托管你的eller不能重新编译PHP安装。

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

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

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

+0

为什么一个班不做的特殊原因?动态加载每个单独的功能将会变得越来越难以维护,可能不是那么实用。 – tadamson 2010-03-16 20:09:26

+0

为了保持能力,我可能最终会这样做。 – 2010-03-16 20:23:17

+0

考虑到这个问题没有太多答案(不是我很惊讶),我会看看我能想出什么来满足速度/可维护性/实用性。如果我确实找到满足此要求的解决方案,那么我会回来并将其发布到此处;) – 2010-03-16 20:53:21

回答

3

您可以将这些功能放入类中,然后设置__autoload函数。如果你反对在类中封装函数,这个解决方案可能不适用于你。我个人喜欢它,因为它允许我为我的函数命名空间并在它们之间共享私有方法。

首先,您设置了类似于此的自动加载功能。你会想调整命名约定来适应你自己的风格,并且可能会引入一些错误处理,但这只是为了获得基本的想法。

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

然后在代码中的任何地方,不管范围如何,都可以这样做。

arrayFunctions::doStuff($myArray); 

PHP将自动尝试包括“图书馆/ arrayFunctions.class.php”,并寻找一个在arrayFunctions类称为“doStuff”方法。

+0

可能是实现它的一种方法。但为什么我应该有一个只有一个静态方法的类?我知道,我很难取悦。其实,我不知道是否有可能将参数传递给__construct(),并直接从__construct()获取返回值,就像调用__toString();当您尝试回显对象时。 – 2010-03-16 20:22:01

+0

Re:“为什么我应该有一个只有一个静态方法的类?” 你可以(也应该!)在类中放置多个方法。从组织的角度来看它很棒,因为你基本上是用这种方式对你的功能进行分类的。 – 2010-03-16 20:49:21

0

我有这个想法的问题。打击文件系统以包含单一功能在降低每秒最大可能请求方面非常昂贵。

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

当你需要全部五项功能时,这显然会变得更糟。

+0

所以在这种情况下,即使格雷格W的解决方案遭受.. – 2010-03-16 20:32:17

+0

只有当你写一个功能每类,我会考虑一个相当滥用类。 – 2010-03-16 21:09:34

+0

嗯,我不明白为什么你应该有一个文件与所有类,然后使用自动加载。为什么不首先使用include/require呢? – 2010-03-16 21:22:55

0
  1. 要在需要时自动加载内容,请将函数放在类中并使用自动加载。
  2. 对于名称冲突,请使用名称空间(如果您有PHP 5.3)。