Проблема с включением в скрипт шаблонов с одинаковыми функциями

275
15 сентября 2017, 22:14

Всем привет. Всю голову сломал, помогите советом. Делаю генерацию XML файлов через gearman. В воркере есть функция которая циклом обходит названия шаблонов и вставляет их внутри функции. Проблема в том что шаблоны хоть и разные но функции у них одинаковые (т.е. названия функций одинаковые) PHP вываливает Fatal error при повторном require.

function regenirationXMLsFreeBoards($job){ //Запуск задачи
    ...
    foreach($FreeBoards as $Board){ //Обходим бесплатные доски
       if(!generationXMLFile($Board)) break;
    }
    ...
}
function generationXMLFile($Board){
    $dir = "../../xmls/";
    $BoardName = $Board["name"];
    $template = $dir."templates/".$BoardName.".php";
    require $template;
    createXML($fileXML); //Эта функция из шаблона $template
    ...
}

Т.е. первый цикл проходит успешно, на втором отваливаемся из за ошибки

PHP Fatal error: Cannot redeclare createXML()

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

Если что то не понятно, спрашивайте, я объясню.

Answer 1

Во включаемых файлах вместо:

function createXML()
{
   // ....
}

Делайте:

$createObjectXML = function () {
   // что нужно
};
$createXML = function () use ($createObjectXML) {
   $var = $createObjectXML();
   // ...
};

Затем:

require $template;
$createXML($fileXML);

Так как это не функция, а переменная, конфликтов не будет.

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

Answer 2

Варианта три (но суть одна - добиться разных "full qualified" имен для функций)

  1. Поменять имена функций, чтобы они не совпадали
  2. Использовать разные пространства имен
  3. Провести рефакторинг и вынести эти функции в методы разных классов
READ ALSO
1С с сайтом создать xml файл [требует правки]

1С с сайтом создать xml файл [требует правки]

Из 1с получается выгрузить данний на сайт но обратно не знаю как правильно создать xml файл,Заказы

269
Фильтр товаров по цене на yii2

Фильтр товаров по цене на yii2

Есть простая форма поиска по цене(форма с input type="text"), вводим цену и она ищет все товары по вводной цене, нужно его реализовать c input type="checkbox"...

659
Проверить массив

Проверить массив

Если массив пустой выводиться сообщение "Ошибка в параметре, оно должно быть числом!"Если в массиве 'Слово' вновь выводится "Ошибка в параметре,...

278
ajax, метод POST

ajax, метод POST

Не понимаю, почему, если в отправке не указать путь к файлу, то будет ошибка 404?

278