为PHP导入软件包还是自动加载?

为PHP导入软件包还是自动加载?,php,autoload,package-managers,Php,Autoload,Package Managers,对于在PHP项目中包含文件,您会推荐什么解决方案 没有对require/include函数的手动调用-所有内容都是通过自动加载函数加载的 需要时导入包 以下是导入API的包: import('util.html.HTMLParser'); import('template.arras.*'); 在此函数声明中,您可以使用点(package hierarchy delimeter)分解字符串,在特定包(文件夹)中的文件中循环,如果在字符串末尾发现星号符号,则只包含其中一个或所有文件,例如('t

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

  • 没有对require/include函数的手动调用-所有内容都是通过自动加载函数加载的
  • 需要时导入包
  • 以下是导入API的包:

    import('util.html.HTMLParser');
    import('template.arras.*'); 
    
    在此函数声明中,您可以使用点(package hierarchy delimeter)分解字符串,在特定包(文件夹)中的文件中循环,如果在字符串末尾发现星号符号,则只包含其中一个或所有文件,例如('template.arras.*')

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

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

    你觉得怎么样

    • 每种方法都有哪些优点/缺点
    • 如何为项目找到最佳解决方案
    • 如果使用包管理,我如何知道是否会出现任何性能问题

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

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

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

    如果速度很慢,你可以加上一些加速器,这会给你带来更多好处。如果速度仍然很慢,你可以通过“编译”过程来运行,在这个过程中,经常使用的文件被转储到普通文件中,自动加载的引用可以被更新到正确的位置


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

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

    我是
    \uu autoload()
    或更好的
    的粉丝 因为它将只包括您正在使用的类以及不关心类位于何处的额外好处。如果您的大学将一个文件移动到另一个目录,您不会受到影响

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

    我不喜欢
    \uu autoload()
    。在许多库中(例如,一些PEAR库),developers使用
    class\u exists()
    ,而不传入相对较新的第二个参数。任何遗留代码都可能存在此问题。如果定义了
    \u autoload()
    ,则可能会导致警告和错误

    如果您的库很清晰,并且没有遗留代码可处理,那么它将是一个很棒的工具。有时我希望PHP在如何管理
    类的行为方面能聪明一点,因为我认为问题出在这个功能上,而不是在自动加载时使用require\u once(“../path to auto load script.PHP.inc”)

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

    例如,所有类都有一个特定的扩展名,比如inc.php
    (因此我知道它们将位于/cls目录中)

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

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

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

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

      • 滚动自己的包装系统可能是个坏主意。我建议您选择explicit manual includes或autoload(或两者的组合)。

        关于此主题的另一个问题: