Рекомендации по функциям автозагрузки - PullRequest
3 голосов
/ 09 апреля 2011

При работе над проектом PHP, в котором используется парадигма ООП с функцией PHP __autoload(), что считается лучшим решением для управления автономными функциями:

( Приведенные примеры для краткости упрощены )

tl; dr : Как обычно обрабатывается загрузка автономных функций:

  • псевдо-автозагрузка (например, с помощью __callStatic magic) [ Option 1 ]
  • абстрактный вспомогательный класс сгруппированных статических методов [ Вариант 2 ]
  • альтернатива

Также обратите внимание, что я опубликовал соответствующий вопрос, касающийся проблемы параметров / ссылок, с option 1 , который можно найти здесь: __ callStatic (), call_user_func_array (), ссылки и 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 ]

4 голосов
/ 09 апреля 2011

Я не вижу точного вопроса здесь, но поскольку название содержит «лучшие практики», вот совет, который я недавно обнаружил:

Это , кажется, предпочтительнееиспользуйте PHP * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.1011 *

Самыми большими преимуществами использования версии SPL (которую я вижу на сегодняшний день) являются:

  • можно использовать / регистрировать более одной функции - функции объединяются вместеи используется последовательно вплоть до одной функции, загружающей файл класса.+ функции также могут быть незарегистрированы на лету.
  • есть некоторая хорошая обработка ошибок, которая может быть реализована (см. пример 3), хотя некоторые шляпные команды try / catch так могут не соответствовать вашему стилю кодирования.
  • с использованием другого расширения (т. Е. Не .php или .php.inc или .inc), если вы выберете с помощью spl_autoload_extensions ()
  • , чтобы убедиться, что автозагрузочный класс «my» не перезаписывается!Если __autoload() будет запущен позже, мои spl_autoload_register() 'ed функции не будут заменены.

1 голос
/ 09 апреля 2011

Я бы не использовал «Вариант 1» в основном потому, что он использует call_user_func *, который будет медленнее, чем напрямую вызывающая функция.

Если вам нужны только некоторые вспомогательные функции, которые на самом деле не связаны друг с другом, то я бы, вероятно, включил файл helpers.php, в котором был бы просто список всех моих вспомогательных функций, которые не инкапсулированы в статическом классе после инкапсуляции на самом деле ничего не добивается в этом случае. В большинстве случаев вспомогательные функции будут использоваться для каждого запроса, поэтому включение этого файла в каждый запрос не принесет никакого вреда ...

...