Какой самый эффективный способ многократного использования класса в PHP?

#php #performance #micro-optimization

#php #Производительность #микрооптимизация

Вопрос:

У меня есть базовая настройка MVC с вспомогательными классами, содержащими служебные методы, некоторые из них, вероятно, будут использоваться при загрузке представления, как в самом представлении, так и в контроллере, а иногда, но не часто, в моделях. Я использую автозагрузку для поиска нужных мне вспомогательных файлов, поэтому класс включается только один раз, затем, теоретически, файл не должен быть снова найден / включен, таким образом, мне не нужно помещать инструкции include в скрипт, и (я полагаю) файл не загружается, если класс не включен.используется.

Мой вопрос в том, что, вероятно, будет наиболее эффективным способом выполнения вызовов этих вспомогательных классов? Должен ли я сделать все методы в данном вспомогательном статическом, или, может быть, использовать одноэлементный шаблон для помощников, или я должен просто создать новый экземпляр везде, где он используется (например, экземпляр в представлении экземпляра в контроллере …)?

спасибо за ваш вклад

Комментарии:

1. Вероятно, это следует пометить micro-optimisation . Вы должны продолжить и написать свой код, а затем посмотреть, что его замедляет, если вообще что-либо.

Ответ №1:

(я полагаю) файл не загружается, если не используется класс.

Правильно. Вот как работает автозагрузка.

Мой вопрос в том, что, вероятно, будет наиболее эффективным способом выполнения вызовов этих вспомогательных классов?

Эффективно, ну, что эффективно? Возможно, с использованием C / C и компиляции материала. В любом случае, давайте попробуем:

Должен ли я сделать все методы в данном вспомогательном статическом,

Нет.

или, может быть, использовать одноэлементный шаблон для помощников

Нет.

или я должен просто создать новый экземпляр везде, где он используется (например, экземпляр в представлении экземпляра в контроллере …)?

ДА. Если вы используете их только время от времени, это очень эффективно, потому что вы можете использовать все, что считаете нужным.

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

Таким образом, вы получите максимальную выгоду от автозагрузки.


Вспомогательный объект, который может иметь несколько помощников, которые вы можете даже передавать, будет автоматически загружаться при первом доступе (отложенная загрузка):

 class Helper
{
    private $helpers = array();
    public function __get($name)
    {
        $name = strtolower($name);
        if(!isset($this->helpers[$name]))
        {
            $classname = ucfirst($name).'Helper';
            $this->helpers[$name] = new $classname;
        }
        return $this->helpers[$name];
    }
}

class Controller
{
    private $helper;
    public function __construct()
    {
        $this->helper = new Helper();
    }

    public function indexAction()
    {
        $ingredients = $this->helper->something->getIngredientsList();
        ....
    }
}
  

Комментарии:

1. Сначала запускается мой контроллер, я мог бы извлечь () все помощники, которые я там использую, чтобы передать их в представление. Может ли это быть более эффективным, чем создание нового SomethingHelper() в представлении / любых других контроллерах, которые используются? Вероятно, это означало бы необходимость проверить, была ли уже определена вспомогательная переменная, а затем создать экземпляр, если нет. Я не знаю, добавляет ли это много накладных расходов.

2. Создайте вспомогательный класс, который является частью вашего контроллера, которому вы можете назначить помощников. Смотрите также классы магических методов, предлагаемые в PHP, вы можете загрузить помощник при первом обращении к свойству: php.net/manual/en/language.oop5.overloading.php , php.net/manual/en/language.oop5.magic.php

3. @user984830: я добавил небольшой пример, это просто быстрый макет, но, возможно, все, что вам нужно, уже есть. Упрощайте, это эффективно.

4. Спасибо, это действительно полезно. Я бы хотел, чтобы помощник также был напрямую доступен для моделей и представлений, а не сохранялся в свойстве контроллера. Было бы что-то неправильное в адаптации вашего вспомогательного класса для работы в качестве помощников::something-> getIngredientsList() ? Я знаю, что сборка мусора не повлияет на это, так что выгоден ли компромисс с повторным созданием экземпляров помощников?

5. Почему модели должны иметь control- и view-helper? В любом случае, почему бы вам не присвоить представлению свойство, чтобы оно знало, к какому контроллеру оно принадлежит, и, следовательно, могло обращаться к помощникам контроллера? Или вы могли бы просто ввести помощников текущего контроллера при выполнении представления. Если вам нужен глобальный реестр для ваших помощников, просто используйте стандартный реестр, который поставляется с PHP: $GLOBALS , например $GLOBALS['Helpers']->something->getIngredientsList(); . Статическое имя класса очень похоже на это. Но его легче изменить позже, потому что вам все равно нужно будет реорганизовать из глобального состояния.