我有一个使用 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 不是一种编译语言,它需要库来编译代码,它是一种脚本语言,它不应该只是逐行运行并运行代码吗?
摘自手册:
关键字必须在文件的最外层作用域(全局作用域)或命名空间声明内声明。这是因为导入是在编译时而不是运行时完成的,因此不能是块作用域。use