为PHP导入包或自动加载?

时间:2009-03-05 19:18:37

标签: php autoload package-managers

您建议在PHP项目中包含文件的解决方案是什么?

  1. 没有手动调用require / include函数 - 所有内容都通过自动加载功能加载
  2. 需要时导入包。
  3. 以下是包导入API:

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

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

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

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

    你怎么看?

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

6 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

我对所有类和inc文件都有一个标准的命名约定,这样可以更容易地编程确定当前正在请求的类名。

例如,所有类都有一个像inc.php一样的扩展名(所以我知道它们将在/ cls目录中)

所有inc文件都以.ht开头(因此它们将位于/ inc目录中)

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

答案 3 :(得分:0)

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

将所有类放入静态数组中,className =>文件路径/类文件。自动加载功能可以使用它来加载类。

这可确保您始终加载最少量的文件。这也意味着你要避免使用完全愚蠢的类名,并解析所述名称。

如果它很慢,你可以使用一些加速器,这将获得更多,如果它仍然很慢,你可以通过'编译'过程运行,通常使用的文件只是转储到公共文件和自动加载引用可以更新以指向正确的位置。

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

滚动自己的包装系统可能是一个坏主意。我建议您使用明确的手动包含,或使用自动加载(或相关的组合)。