PHPSpreadsheet & CodeIgniter -> Message: синтаксическая ошибка, неожиданное «использование» (T_USE) - PullRequest
0 голосов
/ 12 октября 2018

У меня проблемы с созданием тестового файла с использованием библиотеки PHPSpreadsheet в CodeIgniter.Когда я запускаю приведенный ниже код, я получаю сообщение об ошибке:

Обнаружено неперехваченное исключение Тип: ParseError

Сообщение: синтаксическая ошибка, неожиданное использование (T_USE)

Имя файла: C: \ wamp64 \ www \ din-din \ application \ controllers \ home.php

Номер строки: 17

Backtrace:

Файл: C: \ wamp64 \ www \ din-din \ index.php Строка: 315 Функция: require_once

Не могли бы вы объяснить, что происходит?

Тест был выполнен с использованием PHP 5.6.35 и7.2.4, используя WampServer64 3.1.3 и CodeIgniter в версии 3.1.9!Библиотека PHPSpreadsheet была установлена ​​через композитор в соответствии с документацией https://phpspreadsheet.readthedocs.io/en/develop/

Спасибо!

КОД:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Home extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->load->helper('form');
    }

    public function index()
    {

        require 'vendor/autoload.php';

        use PhpOffice\PhpSpreadsheet\Spreadsheet;
        use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        $sheet->setCellValue('A1', 'Hello World !');

        $writer = new Xlsx($spreadsheet);
        $writer->save('hello_world.xlsx');
    }

}

1 Ответ

0 голосов
/ 12 октября 2018

use, как средство для импорта или псевдонима пространства имен, не может быть сделано внутри области действия функции.Чтобы процитировать docs :

Ключевое слово use должно быть объявлено в самой внешней области файла (глобальной области) или внутри объявлений пространства имен.Это связано с тем, что импорт выполняется во время компиляции, а не во время выполнения, и поэтому он не может быть ограничен областью действия блока.: объявление константы, определение функции и т. д. Ваш код будет переписан следующим образом:

<?php
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

defined('BASEPATH') OR exit('No direct script access allowed');

class Home extends CI_Controller {
    // ...

Вы можете поставить use после defined() или после class (то есть внизу файла), но это было бы довольно необычно.

Два примечания:

  1. Существует оператор use, который импортирует переменныев закрытие, вот так function () use ($var) { ... }.То же самое ключевое слово, но в этом лексическом контексте оно не связано с пространством имен.

  2. Если вы используете последнюю версию PHP, вы можете использовать группировку пространства имен, чтобы сэкономить при вводе: use PHPOffice\PhpSpreadsheet\{Spreadsheet, Writer\Xlsx}

...