2009-03-05 70 views
4

建议您将什么解决方案包含在PHP项目中?为PHP导入包或自动加载?

  1. 有没有手动调用的需要/包括的功能 - 一切加载自动加载通过功能
  2. 包装进口,在需要的时候。

这里是包导入API:

import('util.html.HTMLParser'); 
import('template.arras.*'); 

在这个函数的声明,你可以爆炸以点串(包层次分隔符),通过特定的包(文件夹)的文件循环,只包含一个如果星号符号在字符串的末尾被找到,例如,它们或它们全部( 'template.arras。*')。

我可以在包导入方法中看到的好处之一是,它可以强制您使用更好的对象分解和类分组。

我可以在自动加载方法中看到的一个缺点是自动加载功能可能变得非常大而且不是非常明显/可读。

您对此有何看法?

  • 您可以在每种方法中列出哪些优点/缺点?
  • 如何找到该项目的最佳解决方案?
  • 如何使用包管理来了解是否会出现性能问题?
+0

有关此主题的另一个问题:http://stackoverflow.com/questions/791899/efficient-php-auto-loading-and-naming-strategies – grossvogel 2010-05-31 18:20:47

回答

4

我广泛使用__autoload()。我们在我们的应用程序中使用autload功能具有更高班级的向后兼容性了一些调整,但我们在创建新类,允许自动加载时,一般遵循的约定()以相当无缝工作:

  • 一致类命名:每个类都在它自己的文件中,每个类都用camel-case命名并用下划线分隔。这映射到类路径。例如,Some_CoolClass映射到我们的类目录,然后是'Some/CoolClass.class.php'。我认为一些框架使用这个约定。
  • 明确要求外部类:由于我们无法控制我们使用的任何外部库的命名,我们使用PHP的require_once()函数加载它们。
0

我强烈建议执行以下操作来代替:

掷所有的类都为静态数组的className =>文件路径/类文件。自动加载函数可以使用它来加载类。

这确保您始终加载最少量的文件。这也意味着你可以避免完全愚蠢的类名和解析这些名字。

如果速度很慢,您可以使用某些加速器,如果速度仍然很慢,您可以获得更多,您可以通过“编译”流程运行,其中经常使用的文件只是被转储通用文件和自动载入引用可以更新为指向正确的位置。

如果您开始遇到自动加载速度太慢的问题(我觉得很难相信),那么可以根据软件包将其拆分,并且具有多个自动加载功能,这样只需要数组的子集,这样如果您的软件包是围绕您的软件模块(登录,管理员,电子邮件等)定义的,则效果最佳(

1

导入方法是一种改进,但仍会加载超过需要的内容。
或者通过使用星号或脚本的开始装起来(因为在导入之前所有的“新类别名称”会成为累赘)

我还是__autoload()风扇的甚至更好spl_autoload_register()
因为它将只包括您正在使用的课程以及不关心课程所在位置的额外好处。如果你的大学把文件移动到另一个目录,你不受影响。

缺点是它需要额外的逻辑 才能使其与目录正常工作。

0

我不是__autoload()的粉丝。在许多库(例如一些PEAR库)中,开发人员使用class_exists()而不传入相对较新的第二个参数。您拥有的遗留代码也可能存在此问题。如果您定义了__autoload(),这可能会导致警告和错误。

如果你的图书馆很明确,但你没有遗留代码来处理,它是一个很棒的工具。我有时希望PHP对他们如何管理class_exists()的行为有点聪明,因为我认为问题出在那个功能上,而不是__autoload()

1

我使用require_once(“../路径到自动负载script.php.inc”),支持自动负载

我对所有类和INC文件,这使得它更容易标准命名约定以编程方式确定当前正在请求什么类名称。

例如,所有的类都具有一定的延伸一样inc.php
(所以我知道他们会在/ CLS目录)

所有Inc文件开始.HT(这样就在/ inc目录中)

自动加载接受一个参数:className,然后用它来确定文件实际位于何处。循环一次,我知道我的目标目录是什么,每次添加“../”来说明子子页面(这似乎为我打破自动加载),并最终require_once'ing实际的代码文件一旦找到。

0

滚动您自己的包装系统可能是一个坏主意。我建议你去明确的手动包括,或与自动加载(或为此事的组合)。