PHPSpreadsheet 和 CodeIgniter -> 消息:语法错误,意外的“使用”(T_USE)

Dêi*_*uza 2 php codeigniter phpspreadsheet

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

遇到未捕获的异常类型:ParseError

消息:语法错误,意外的“使用”(T_USE)

文件名:C:\wamp64\www\din-din\application\controllers\home.php

线路编号:17

回溯:

文件: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/中的文档通过 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');
    }

}
Run Code Online (Sandbox Code Playgroud)

bis*_*hop 5

use作为导入或别名命名空间的方法,不能在函数作用域内进行。引用文档

use 关键字必须在文件的最外层作用域(全局作用域)或命名空间声明内声明。这是因为导入是在编译时而不是运行时完成的,因此不能是块作用域的。

约定是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 {
    // ...
Run Code Online (Sandbox Code Playgroud)

可以将放在use后面defined(),或者放在 后面class(即放在文件的底部),但这很不寻常。

两个注意事项:

  1. 有一个use运算符将变量导入到 Closure 中,如下所示function () use ($var) { ... }。相同的关键字,但在该词法上下文中它与命名空间无关。

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