2011-10-07 3 views
1

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

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

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

+1

Это, вероятно, должно быть помеченным 'микро-optimisation'. Вы должны пойти дальше и написать свой код, а затем взглянуть на то, что замедляет его, если что-либо вообще. – Bojangles

ответ

1

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

Исправить. Вот как работает автозагрузка.

Вопрос: что может быть самым эффективным способом совершения звонков на эти вспомогательные классы?

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

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

No.

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

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

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

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

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


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

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(); 
     .... 
    } 
} 
+0

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

+0

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

+0

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

Смежные вопросы