накладные расходы глобальной переменной php в платформе - PullRequest
5 голосов
/ 08 сентября 2011

В настоящее время я разрабатываю фреймворк, в котором используется объект класса Core (этот класс обладает огромной функциональностью и обеспечивает работу фреймворка). Структура соответствует архитектуре MVC и имеет слабо связанные классы Model, Control, View. Тезисные классы нуждаются в большой ссылке на класс Core. До сих пор я делал: создание отдельного объекта класса Core и обращение к нему по ключевому слову PHP global в классах Model, Control, View.

Мне не нравится использовать этот подход в основном потому, что:

  • В моем смысле этот путь не является истинно объектно-ориентированным
  • IDE (netbeans) не может предоставить документацию для объекта класса Core - боль для разработчиков, которые будут использовать эту платформу.
  • Я действительно беспокоюсь о проблемах с производительностью - понятия не имею, медленнее ли global или как-то еще.

Я искал и не нашел никакой информации относительно проблемы с производительностью. Я также искал stackoverflow и нашел Создает ли использование global какие-либо издержки? & Преимущество / недостаток между глобальными переменными и параметрами функций в PHP? и т. Д., Но они не содержат много Информация. Сейчас моя главная проблема - производительность , поэтому, пожалуйста, помогите.

Ответы [ 3 ]

4 голосов
/ 08 сентября 2011

Я должен согласиться с NevilleK , что ваш класс Core звучит по линии God Object antipattern.

И для любого достаточно глупого, чтобы предложить использование синглетонов /реестры, я бы предложил сделать небольшое исследование по этому вопросу.Они создают то же глобальное состояние, что и ваши классические глобальные переменные.

Глобальное состояние - это не столько вопрос производительности (хотя в php оно имеет незначительное влияние), но создание непроверяемого и тесно связанного кода.

Вы действительно должны заглянуть в Dependency Injection .Это может показать вам другой путь, который не требует наличия такого класса Core в вашем коде.


Некоторые дополнительные видео для вас:

2 голосов
/ 09 сентября 2011

Я решил похожую проблему в Agile Toolkit , создав другой шаблон для , добавив объект и используя его для всей системы. Это передает свойство вновь созданным объектам с именем «api», которое всегда ссылается на Класс приложения .

Класс приложения на самом деле не является классом God, но он делегирует все виды функциональности системным контроллерам, страницам и т. Д. В этом скриншоте объясняется, как структурированы самые базовые объекты, это может быть то, что вы также ищете:

http://www.youtube.com/watch?v=bUNEHqYVOYs

1 голос
/ 08 сентября 2011

Во-первых, пока вы обеспокоены производительностью, вы можете сначала прочитать http://en.wikipedia.org/wiki/God_object - ваш «базовый» класс звучит как «объект Бога», который является довольно устоявшимся анти-паттерном.

С точки зрения производительности - лучший способ выяснить это - протестировать ее.Если вы пишете фреймворк, я предполагаю, что вы пишете модульные тесты для проверки его поведения;несложно расширить это модульное тестирование, включив в него простые показатели производительности.Вы также можете инвестировать в тестовые сценарии с использованием JMeter или аналогичных программ, чтобы реализовать «справочную реализацию» нескольких страниц, созданных с использованием инфраструктуры.Делая это, вы получите гораздо лучшую информацию о вашей конкретной ситуации, чем пытаясь оптимизировать дизайн на основе коллективных знаний Stack Overflow о том, как все работает.

В целом, я бы сказал, что наличие глобального класса не должно сильно влиять на производительность, если он не выполняет много работы.Простая загрузка класса в память, его синтаксический анализ и т. Д. Влияет на производительность, но вряд ли он будет значительно медленнее, чем любые другие маршруты, которые вы могли бы использовать.

Если, однако, ваш «базовый» класс выполняет много логики инициализации, когда к нему обращается страница, это, очевидно, повлияет на производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...