自动加载功能最佳实践

时间:2011-04-08 21:18:33

标签: php function static-libraries autoload

当处理利用PHP __autoload()函数的OOP范例的PHP项目时,以下哪项被认为是管理独立函数的最佳实践:

为简洁起见,简化了提供的示例

  

tl; dr :如何通常处理独立函数加载:

     
      
  • 伪自动加载(例如,通过__callStatic魔法)[选项1 ]
  •   
  • 抽象助手类分组静态方法[选项2 ]
  •   
  • 另类
  •   

另请注意,我发布了与选项1 相关的参数/参考问题的相关问题,可在此处找到:__callStatic(), call_user_func_array(), references, and PHP 5.3.1

index.php

中给出
function __autoload($class){
    require $class . '.class.php';
}

选项1; “自动加载”功能的抽象Core类(或Library或其他类似物):

## Core.class.php
abstract class Core{
    public static function __callStatic($function, $arguments){
        if(!function_exists($function)){
            require $function . '.function.php';
        }
        return call_user_func_array($function, $arguments);
    }
}

## SayHello.function.php
function sayHello(){
    echo 'Hello';
}

## SayGoodbye.function.php
function sayGoodbye(){
    echo 'Goodbye';
}

## index.php
Core::sayHello();   // Hello
Core::sayGoodbye(); // Goodbye

选项2;将相关函数分组为静态调用的抽象“帮助程序”类:

## SayStuff.class.php
abstract class SayStuff{
    public static function sayHello(){
        echo 'Hello';
    }
    public static function sayGoodbye(){
        echo 'Goodbye';
    }
}

## index.php
SayStuff::sayHello();   // Hello
SayStuff::sayGoodbye(); // Goodbye

2 个答案:

答案 0 :(得分:4)

我在这里看不到一个确切的问题,但由于标题包含“最佳实践”,这里有一条我最近发现的建议:

It seems to be preferable to use PHP's SPL autoload functions instead of __autoload()(关于“大卫解剖”博客的好例子。)

引用链接的博文:

  

使用SPL的最大好处   版本(我可以看到迄今为止)是:

     
      
  • 可以使用/注册多个功能 - 功能是   链接在一起并按顺序使用   直到一个功能点   加载类文件。 +功能也可以即时取消注册。
  •   
  • 可以实现一些很好的错误处理(参见   例3),虽然有些帽子   尝试/捕捉所以这可能不适合你的   编码风格。
  •   
  • 使用不同的扩展名(即不是.php或.php.inc或.inc)if   你这么选择   spl_autoload_extensions()
  •   
  • 确保“我的”自动加载类不会被覆盖!如果   __autoload()稍后运行spl_autoload_register()'ed函数   不会被替换。
  •   

答案 1 :(得分:1)

我不会使用'选项1',主要是因为它使用call_user_func *,这比直接调用函数要慢。

如果你只需要一些并不真正联系在一起的辅助函数,那么我可能会包含一个文件helpers.php,它只包含我所有的helper函数列表,这些函数在封装后没有封装在静态类中在这种情况下并没有真正实现任何目标。大多数时候帮助函数将用于每个请求,因此在每个请求中包含此文件不会造成任何伤害......