4

对于在 PHP 项目中包含文件,您会推荐什么解决方案?

  1. 不需要手动调用 require/include 函数 - 一切都通过自动加载函数加载
  2. 需要时导入包。

这是包导入API:

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

在此函数声明中,您可以用点(包层次结构分隔符)分解字符串,循环遍历特定包(文件夹)中的文件以仅包含其中一个或全部,如果在字符串末尾找到星号符号,例如('template.arras.*')。

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

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

你怎么看待这件事?

  • 您可以在每种方法中说出哪些优点/缺点?
  • 我怎样才能找到项目的最佳解决方案?
  • 如果使用包管理,我如何知道是否会有任何性能问题?
4

6 回答 6

4

我广泛使用 __autoload()。我们在应用程序中使用的 autload 函数对旧类的向后兼容性进行了一些调整,但我们通常在创建允许 autoload() 工作的新类时遵循一个约定:

  • 一致的类命名:每个类在其自己的文件中,每个类以驼峰命名,并用下划线分隔。这映射到类路径。例如,Some_CoolClass 映射到我们的类目录,然后是“Some/CoolClass.class.php”。我认为一些框架使用这种约定。
  • 显式需要外部类:由于我们无法控制我们使用的任何外部库的命名,我们使用 PHP 的 require_once() 函数加载它们。
于 2009-03-05T20:17:04.593 回答
1

导入方法是一种改进,但仍会加载超出需要的内容。
通过使用星号或在脚本开头加载它们(因为在每个“新类名”之前导入会变得很麻烦)

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

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

于 2009-03-05T19:41:16.473 回答
1

我使用 require_once("../path-to-auto-load-script.php.inc") 自动加载

我对所有类和 inc 文件都有一个标准命名约定,这使得以编程方式确定当前请求的类名变得更加容易。

例如,所有类都有一个特定的扩展名,比如 inc.php
(所以我知道它们将在 /cls 目录中)
并且
所有 inc 文件都以 .ht 开头(所以它们将在 /inc 目录中)

auto load 接受一个参数:className,然后我用它来确定文件的实际位置。一旦我知道我的目标目录是什么就循环,每次添加“../”来说明子子页面,(这对我来说似乎破坏了自动加载),最后一旦找到实际的代码文件就需要一次。

于 2009-03-05T19:53:34.930 回答
0

我强烈建议您改为执行以下操作:

将所有类放入一个静态数组中,className => filepath/classFile。自动加载功能可以使用它来加载类。

这可确保您始终加载最少数量的文件。这也意味着您避免完全愚蠢的类名,以及对所述名称的解析。

如果它很慢,您可以使用一些加速器,这将为您带来更多收益,如果它仍然很慢,您可以通过“编译”过程运行,经常使用的文件只是转储到公共文件中,并且可以更新自动加载引用以指向正确的位置。

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

于 2009-03-05T19:38:59.990 回答
0

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

如果您的库很清晰,并且您没有要处理的遗留代码,那么它是一个很棒的工具。有时我希望 PHP 在他们如何管理行为方面更聪明一点class_exists(),因为我认为问题在于该功能而不是__autoload().

于 2009-03-05T19:50:53.363 回答
0

滚动你自己的包装系统可能是个坏主意。我建议您使用明确的手动包含或自动加载(或就此而言的组合)。

于 2009-03-05T22:30:08.003 回答