В моем проекте HMVC я реализовал Arrays
учебный класс. это STATIC Методы используются в целом для обработки различных операций над многомерными массивами. Помимо этого класса я тоже использую похожие: Files
, Images
, Printer
, Messages
, Classes
и т. д. Но я больше не хочу, чтобы в моем проекте были статика или синглтоны.
Я вижу их как помощников, конечные классы имеют методы, используемые для простого выполнения определенных задач над компонентами проекта или с ними (объединение массивов, изменение размера изображений, загрузка / печать файлов и т. Д.). Поэтому я хочу … минимизировать их распространение в моем проекте.
Например, я не считаю оптимальным передать Arrays
объект в каждом дочернем контроллере, просто потому, что в конструкторе базового класса контроллера некоторые массивы должны быть объединены.
Я хотел бы спросить:
Arrays
как зависимость конструктора, а статический проблема будет элегантно решена таким образом. Это правда или есть лучшая альтернатива?Буду признателен за любую вашу точку зрения.
Большое спасибо!
P.S:
Здесь Arrays
класс, если вам нужно взглянуть на него:
<?php
namespace MYMVC\Utils;
/**
* Arrays: utility class to handle operations on multidimensional arrays.
*/
class Arrays {
/* ------------------------------------------------------------- */
/* Keypath format: '{key0}/{key1}/{key2}/{key3}/{searched-key}'. */
/* ------------------------------------------------------------- */
/** Set the value in array at the specified keypath. [...] */
public static function setArrayValue(&$array, $keypath, $value, $delimiter = '/') { ... }/** Get a tree structure from the specified keypath. [...] */
public static function buildArrayTree($keypath, $value, $delimiter = '/') { ... }/** Check if the specified keypath exists in array. [...] */
public static function arrayKeyExists(&$array, $keypath, $delimiter = '/') { ... }/** Get the array value from the specified keypath. [...] */
public static function getArrayValue(&$array, $keypath, $delimiter = '/') { ... }/** Merge multiple multidimensional arrays. [...] */
public static function mergeMultipleArrays(/* func_get_args */) { ... }/** Merge the top multidimensional array over the base multidimensional array. [...] */
public static function mergeArrays($base, $top) { ... }
}
Что-то вроде Arrays::mergeArrays
не так. Вы не против позвонить in_array
или же array_merge
в ваших классах, нет? Ты можешь позвонить Arrays
класс «полезности», если хотите, но я не думаю, что вы можете сделать то же самое для Files
,
Если ваша текущая проблема — «Я не хочу передавать объект xyz каждому дочернему контроллеру», то обычно у вас есть мысли:
Просто введите DIC в ваши контроллеры. Затем восстановите свою зависимость от него. Это то, что называется «Service Locator» и широко используется многими фреймворками. Преимущество в том, что вы можете требовать зависимости только там, где она вам нужна, и тогда, когда она вам нужна. Но у него есть ряд недостатков. Ваш объект не может существовать без него, и ваши классы не могут быть легко издевались. Вот почему это считается анти-паттерном.
Внедрить свою зависимость (т.е. Files
) явно в ваших контроллерах. Почему вы должны хотеть скрыть тот факт, что ваш контроллер зависит от Files
? Единственная проблема здесь, особенно с контроллерами, в том, что многие зависимости не всегда используются всеми методами класса. Это больше проблема производительности, и вы можете решить ее разными способами (пример:
Объект действия).
Выберите то, что работает для вас.
Других решений пока нет …