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

时间:2018-10-12 03:15:46

标签: 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和3.1.9版的CodeIgniter进行的!根据{{​​3}}

中的文档,通过composer安装了PHPSpreadsheet库。

谢谢!

代码:

<?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 :(得分:2)

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

  

必须在文件的最外部作用域(全局作用域)或内部命名空间声明中声明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 {
    // ...

可以use放在defined()之后,或class之后(即文件的底部),但是那相当不寻常。

两个注意事项:

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

  2. 如果您使用的是最新版本的PHP,则可以使用命名空间分组来保存自己的输入内容:use PHPOffice\PhpSpreadsheet\{Spreadsheet, Writer\Xlsx}