При работе над проектом 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()
не будут заменены.