Можно ли использовать spl_autoload_register() для добавления внешних функций в FPDF?

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

Возможно ли это в FPDF? Я хотел бы, чтобы приведенные ниже функции не входили в мой основной класс создателя FPDF... У меня будет 5 или 6 категорий, возможно, с 20 элементами, и добавление всего этого кода сделает класс создателя PDF очень большим...

(почему, черт возьми, мы не можем просто использовать «включить или потребовать») Нельзя ли добавить функцию «автозагрузки» непосредственно в PHP, чтобы мы могли просто использовать «включить или потребовать», чтобы добавить что-то обратно? :)

Если я создам класс со всеми функциями элемента внутри, можно ли загрузить его в класс создателя PDF?

class ladiesClass {

function Item1() {
    if (isset($_POST["item1Qty"][0]) && !empty($_POST["item1Qty"][0]) || 
    isset($_POST["item1Qty"][1]) && !empty($_POST["item1Qty"][1]) ||
    isset($_POST["item1Qty"][2]) && !empty($_POST["item1Qty"][2]) ||
    isset($_POST["item1Qty"][3]) && !empty($_POST["item1Qty"][3]) ||
    isset($_POST["item1Qty"][4]) && !empty($_POST["item1Qty"][4]) ||
    isset($_POST["item1Qty"][5]) && !empty($_POST["item1Qty"][5])) {
    $item1Qty = $_POST['item1Qty'];
    $item     = $_POST['item1'];
    $desc     = $_POST['desc1'];
    $color    = $_POST['color1'];
    $this->SetFont('Arial', '', 10);
    $this->SetFillColor(242);
    $this->SetLineWidth(1); 
    $this->SetX(33);
    $this->Cell(97, 20, $item, 'LRB', 0, 'L');
    $this->Cell(300, 20, $desc, 'LRB', 0, 'L');
    $this->Cell(95, 20, $color, 'LRB', 0, 'L');
    $this->Cell(28, 20, $item1Qty[0], 'LRB', 0, 'C');
    $this->Cell(28, 20, $item1Qty[1], 'LRB', 0, 'C');
    $this->Cell(28, 20, $item1Qty[2], 'LRB', 0, 'C');
    $this->Cell(28, 20, $item1Qty[3], 'LRB', 0, 'C');
    $this->Cell(28, 20, $item1Qty[4], 'LRB', 0, 'C');
    $this->Cell(28, 20, $item1Qty[5], 'LRB', 0, 'C');
    $this->Cell(28, 20, '', 'LRB', 0, 'C');
    $this->Cell(38, 20, array_sum($item1Qty), 'LRB', 1, 'C');        
}
}
//   ITEM 2
function Item2() {
    if (isset($_POST["item2Qty"][0]) && !empty($_POST["item2Qty"][0]) || 
    isset($_POST["item2Qty"][1]) && !empty($_POST["item2Qty"][1]) ||
    isset($_POST["item2Qty"][2]) && !empty($_POST["item2Qty"][2]) ||
    isset($_POST["item2Qty"][3]) && !empty($_POST["item2Qty"][3]) ||
    isset($_POST["item2Qty"][4]) && !empty($_POST["item2Qty"][4]) ||
    isset($_POST["item2Qty"][5]) && !empty($_POST["item2Qty"][5])) {
    $item2Qty = $_POST['item2Qty'];
    $item     = $_POST['item2'];
    $desc     = $_POST['desc2'];
    $color    = $_POST['color2'];               
    $this->SetFont('Arial', '');
    $this->SetFillColor(242);
    $this->SetLineWidth(1); 
    $this->SetX(33);
    $this->Cell(97, 20, $item, 'LRB', 0, 'L');
    $this->Cell(300, 20, $desc, 'LRB', 0, 'L');
    $this->Cell(95, 20, $color, 'LRB', 0, 'L');     
    $this->Cell(28, 20, $item2Qty[0], 'LRB', 0, 'C');
    $this->Cell(28, 20, $item2Qty[1], 'LRB', 0, 'C');
    $this->Cell(28, 20, $item2Qty[2], 'LRB', 0, 'C');
    $this->Cell(28, 20, $item2Qty[3], 'LRB', 0, 'C');
    $this->Cell(28, 20, $item2Qty[4], 'LRB', 0, 'C');
    $this->Cell(28, 20, $item2Qty[5], 'LRB', 0, 'C');
    $this->Cell(28, 20, '', 'LRB', 0, 'C');
    $this->Cell(38, 20, array_sum($item2Qty), 'LRB', 1, 'C');
}
}
}       //   ITEM 3, ITEM 5, etc.....

person Bigfootbud    schedule 25.03.2018    source источник
comment
Ваши вопросы не имеют для меня смысла. В какой «основной класс» вы хотите их включить? Поскольку вы явно не имеете в виду основной класс FPDF. Возможно, вам нужен учебник? См.: czettner.com/blog/13/11/01/ spl-autoloader-tutorial-juniors   -  person KIKO Software    schedule 25.03.2018


Ответы (1)


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

class Item1Creator {
    public static function create(FPDF $fpdfObject) {
       // content of your function Item1()
       // you should change $this to $fpdfObject
    }
}

Затем, если вы сохраните этот класс в файле f.e. items/Item1Creator.php вы можете использовать в своем доме $itm1 = Item1Creator::create() вместо $itm1 = Item1()

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

autload_spl_register(function($class) {
    $file = __DIR__ . '/items/' . $class . '.php';
    if (file_exists($file)) {
        include $file;
    }
});

Решение выше плохо по многим причинам

  • Плохо использует предметы. Существует множество шаблонов проектирования, которые вам следует изучить
  • Использование методов/функций без параметров для загрузки данных из суперглобальных переменных вместо данных первого чтения
  • вам, вероятно, следует просто включить файлы с функциями в верхней части вашего класса FPDF

Но это должно работать. Вам предстоит многому научиться, но не сдавайтесь ;о)

person Jakub A.    schedule 25.03.2018
comment
Спасибо за ответ! Я обновил свой вопрос, добавив, что я пытаюсь загрузить класс, заполненный этими функциями элемента... Я ошибаюсь? - person Bigfootbud; 25.03.2018
comment
Вы пытаетесь использовать классы partial, которые не поддерживаются в PHP. Есть много способов, как достичь своей цели. Основываясь на вашем коде, я бы предложил использовать простой цикл for в одном методе. Не уверен, но похоже, что вы создаете таблицу ровно из 20 строк. Программирование здесь для вас, чтобы вы могли делать несколько простых вещей и связывать их вместе. Ф.э. вам следует написать один метод Item(), который принимает некоторые аргументы (например, Item($rowNum, $qty, $name, $color)) и выполняет все обычные действия. Кажется, что все элементы одинаковые, отличаются только координаты PDF (но есть простая математика $rowNum->$coo) - person Jakub A.; 25.03.2018