Подключение функций

Патриот

Новичок
Здравствуйте, уважаемые люди!
Как всем известно в PHP нельзя настроить автозагрузку/автоподключение (autoload) функций. Только классов.

В связи с этим мне очень НЕ хочется:
1. Подключать функции через классы (примеры: http://stackoverflow.com/questions/4737199/autoloader-for-functions).
2. Объявлять все функции в одном файле и подключать его.

Меня устраивает вызов require в начале каждого файла, где используется подгружаемая функция. Но тут есть загвоздка. Если файл с функцией загружается повторно то PHP падает с ошибкой "Cannot redeclare function". В связи с этим есть несколько путей решения:
1. Использовать require_once. Не годится т.к. медленно (http://stackoverflow.com/questions/186338/why-is-require-once-so-bad-to-use).
2. Использовать function_exists:
Код:
if(!function_exists('my_func')){
    function my_func() {
        // ...
    }
}
Этот способ проигрывает в производительности следующему.
3. Испльзовать константы:
Код:
if(!defined('my_func')){
    function my_func() {
        // ...
    }
    definde('my_func', 1);
}
Кто-нибудь знает ещё способы? Последний вариант получился громоздким. Вот если бы в PHP можно было написать как-нибудь так:
Код:
if(!defined('my_func')){
    definde('my_func', 1);
    continue;
}
function my_func() {
    // ...
}
тогда я бы остановился на этом варианте...
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Я думал этим уже не страдают нигде
 

AmdY

Пью пиво
Команда форума
Про медленно - это клиника, а учитывая что уже давно есть opcache, то и вовсе миф.

У тебя куча других проблем.
Функции, нафик они в глобальном неймспейсе, заверни в статический класс.
Файл не должен подключаться дважды, ищи проблему, а не последствия.
Компосер умеет сам инклудить файл, RTFM
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@AmdY, У него скорей всего хелперы это, они как раз должны быть в глобале, чтобы можно было легко их вызывать в шаблоне, к примеру. Просто сколько таких у него функций. Явно не миллион, как в том синтетическом тесте с SOF
 
  • Like
Реакции: AmdY

AnrDaemon

Продвинутый новичок
Я буквально неделю назад страдал этой же головной болью. Приправленной конфликтами имён функций.
Потом плюнул и сделал один статик класс в своём неймспейсе, один в НС проекта.
И код сразу стал прост и понятен.
 

AmdY

Пью пиво
Команда форума
@AmdY, У него скорей всего хелперы это, они как раз должны быть в глобале, чтобы можно было легко их вызывать в шаблоне, к примеру. Просто сколько таких у него функций. Явно не миллион, как в том синтетическом тесте с SOF
да, при таком кейсе это норм, но тогда их нужно обязательно подключать сразу, чтобы не было рантайм приключений на свою жопу как у говнокодеров с вордпреса.


есть подозрение, что чувак думает о микроптимизации перфоманса.
 

fixxxer

К.О.
Партнер клуба
1. Использовать require_once. Не годится т.к. медленно (http://stackoverflow.com/questions/186338/why-is-require-once-so-bad-to-use).
Медленно было в 2008-м году, когда этот вопрос и был задан (да и то это тебя не должно волновать если у тебя не фейсбук). Где-то в районе php 5.2-5.3 был сделал realpath cache, и твои define-ы с проверками будут медленнее, чем require_once на современных версиях.
 

Патриот

Новичок
Медленно было в 2008-м году, когда этот вопрос и был задан (да и то это тебя не должно волновать если у тебя не фейсбук). Где-то в районе php 5.2-5.3 был сделал realpath cache, и твои define-ы с проверками будут медленнее, чем require_once на современных версиях.
Запустил у себя на PHP 5.4.45 код из того топика, вот результат:
Код:
if defined      0.2794668674469
require_once    1.2445631027222
 

HORO

Новичок
Получается если к странице будут 1млн/сек обращений делать, на дефайнах можно целую секунду сэкономить ))
 
Сверху