当我在 if 块内移动 use 语句时,为什么会出现语法错误?

问题描述 投票:0回答:1

我有一个使用 PHPmailer 的联系表单。

如果我这样写就可以了:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

if($_REQUEST['action'] == 'contact'){
    require 'vendor/autoload.php';
...

但是,我只在提交联系表单时需要 PHP 邮件程序代码。所以我想做的是看到它 /?action=contact 是 url 的一部分,并且仅当它创建邮件程序对象时。但是,当我将代码更改为:

if($_REQUEST['action'] == 'contact'){
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\SMTP;
    use PHPMailer\PHPMailer\Exception;

    require 'vendor/autoload.php';
...

我明白了 解析错误:语法错误,C:\Users\moren\source 中意外的标记“use” epos idiumpa.com\index.php 第 14 行

我什至尝试将 use 命令放入名为 test.php 的文件中。

测试.php

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

然后将index.php中的代码更改为:

if($_REQUEST['action'] == 'contact'){
    require "test.php";

    require 'vendor/autoload.php';
...

但是运行时出现错误:

致命错误:未捕获错误:在 C:\Users\moren\source 中找不到类“PHPMailer” epos idiumpa.com\index.php:27 堆栈跟踪:#0 {main} 抛出在 C:\Users\moren\source 中 epos idiumpa.com\index.php 第 27 行

这不再是解析错误,更像是 use 命令在 test.php 中时不起作用。

我要查一下 PHP 中的 use 的作用。我认为它正在创建对象的实例,但我认为它可能就像 using namespace std;在C++中。我仍然不明白为什么我不能在 if 块中有条件地使用它。 PHP 不是一种编译语言,它需要库来编译代码,它是一种脚本语言,它不应该只是逐行运行并运行代码吗?

php
1个回答
0
投票

摘自手册

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

© www.soinside.com 2019 - 2024. All rights reserved.