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)
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(即放在文件的底部),但这很不寻常。
两个注意事项:
有一个use运算符将变量导入到 Closure 中,如下所示function () use ($var) { ... }。相同的关键字,但在该词法上下文中它与命名空间无关。
如果您使用的是最新版本的 PHP,您可以使用命名空间分组来节省一些输入:use PHPOffice\PhpSpreadsheet\{Spreadsheet, Writer\Xlsx}