Особенности хуков и хукфункций

Все параметры передаются в хукфункцию по ссылке &!

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

При таком подходе у нас отпадает необходимость возвращать (return) какие либо данные из хукфункции, в отличии от Wordpress, нет деление на хуки и фильтры - меньше путаницы с возвратом данных. На стадии подключения, вы сами решаете менять данные внутри хукфункции или нет разница всего один символ.
Например где-то в коде запускается хук initLogic 

    global $buLogicMap;
    doHook('initLogic', $buLogicMap);

В хук передается глобальная переменная $buLogicMap. Это реальный код CMS, а что такое buLogicMap будет описано позже. Итак, вы хотите подключится к этому хуку и посмотреть, что же это за переменная, изменять ее мы пока не собираемся просто распечатаем: 

addHook('initLogic', 'myShowLogic'); 
function myShowLogic($data)
{ 
   echo '<pre>'; 
   print_r($data); 
   echo '</pre>'; 
} 

Кому интересно можно добавить этот код в модуль test.php он у нас как раз для тестирования и примеров.
Ну а если нам надо изменить массив $buLogicMap пишем так :

addHook('initLogic', 'myEditLogic'); 
function myEditLogic( &$data )
{ 
    $data[] = ['id' => 'myTest', 'parent'=>'index']; 
}

Вот так мы добавим новый элемент в массив $buLogicMap. Обратите внимание на подключение и значок ампресанда & перед $data.

Хукфункция может принимать не более 5 параметров.

Это ограничение связанно с передачей параметров по ссылке метод Dispatcher-> doHook вот так он выглядит: 

 public function doHook($hookName, & $arg1 = null,
 & $arg2 = null,  & $arg3 = null,  & $arg4 = null, & $arg5 = null)
{ ....    .... }

Но вообще я не считаю это ограничением, если у вас функция принимает больше 5 аргументов, то с вами явно что-то не так. Группируйте данные в массив или объект.

Порядок подключения хукфункций

В этом вопросе у меня нет определенности, но пока работает следующие правила:

  • При подключении хукфункции можно указать порядковый номер - это должно быть целое число включая отрицательные.
  • если порядковый номер не указан то хукфункции будет присвоен автоматически номер равный = существующий максимальный номер + 1 (по правилу добавления элемента в массив $arr[] = новый элемент)
  • если в вы подключаете хукфункцию, а такой номер уже в массиве есть, то новая хукфункция заменит (затрет ) старую 
addHook('work', 'myNum0');
function myNum0()
{
    echo '<strong>'.__FUNCTION__.'</strong><br />';
};

addHook('work', 'myNum_100', 100);
function myNum_100()
{
    echo '<strong>'.__FUNCTION__.'</strong><br />';
};

addHook('work', 'myNumKyKy');
function myNumKyKy()
{
    echo '<strong>'.__FUNCTION__.'</strong><br />';
};

addHook('work', 'myNum_333', 333);
function myNum_333()
{
    echo '<strong>'.__FUNCTION__.'</strong><br />';
};

addHook('work', 'myNum_333_New', 333);
function myNum_333_New(){
    echo '<strong>'.__FUNCTION__.'</strong><br />';
};

addHook('work', 'myNumFirst', -10);
function myNumFirst()
{
    echo '<strong>'.__FUNCTION__.'</strong><br />';
}

Результат выполнения будет таким:

myNumFirst
myNum0
myNum_100
myNumKyKy
myNum_333_New

myNumFirst - отработает самой первой хотя в коде она добавляется в конце, но у нее ключ массива равен -10 поэтому при сортировке она вылезет на первое место.
myNumFirst добавится сразу за myNumFirst то есть получит ключ массива 101 и отработает соответственно сразу за ней
myNum_333_New затрет myNum_333 так как у них одинаковый номер.