PHPSpreadsheet & CodeIgniter -> 消息:语法错误,意外 'use' (T_USE)

PHPSpreadsheet & CodeIgniter -> Message: syntax error, unexpected 'use' (T_USE)

我在使用 CodeIgniter 中的 PHP 电子表格库创建测试文件时遇到问题。当我 运行 下面的代码时,我收到错误消息:

An uncaught Exception was encountered Type: ParseError

Message: syntax error, unexpected 'use' (T_USE)

Filename: C:\wamp64\www\din-din\application\controllers\home.php

Line Number: 17

Backtrace:

File: C:\wamp64\www\din-din\index.php Line: 315 Function: require_once

你能解释一下发生了什么吗?

测试使用PHP5.6.35和7.2.4进行,使用WampServer64 3.1.3和3.1.9版本的CodeIgniter! PHP电子表格库是根据 https://phpspreadsheet.readthedocs.io/en/develop/

中的文档通过 composer 安装的

谢谢!

代码:

<?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');
    }

}

use,作为导入或别名命名空间的一种方式,不能在函数范围内进行。引用 docs:

The use keyword must be declared in the outermost scope of a file (the global scope) or inside namespace declarations. This is because the importing is done at compile time and not runtime, so it cannot be block scoped.

惯例是将 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 运算符可以将变量导入 Closure,就像这样 function () use ($var) { ... }。相同的关键字,但在该词法上下文中它与命名空间无关。

  2. 如果您使用的是 PHP 的最新版本,您可以使用名称空间分组来节省一些输入:use PHPOffice\PhpSpreadsheet\{Spreadsheet, Writer\Xlsx}