Оптимальные методы работы с автозагрузкой

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

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

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

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

Также обратите внимание: я опубликовал связанный с этим вопрос о проблеме с параметром / ссылкой с параметром 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 

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

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

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

    Кажется предпочтительным использовать функции автозагрузки PHP SPL вместо __autoload () (хороший пример в блоге «Dissection by David»).

    Цитирование связанного сообщения в блоге:

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

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