此问题在此处已有答案:
PHP use class in global namespace(5个答案)
8小时前关闭
我通过Composer安装了三个库。
https://github.com/barbushin/php-imap
https://github.com/PHPMailer/PHPMailer
https://github.com/openai-php/client
字符串
我尝试在index.php文件中使用它,如
<?php
namespace PhpImap;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
.....
?>
型
这一行给我报错了
$client = OpenAI::client($yourApiKey);
型
叫的
PHP Fatal error: Uncaught Error: Class "PhpImap\OpenAI" not found in /home/myuser/mydomain.com/dashboard/crons/reply/reply.php:216
型
我的composer.json如下所示
{
"config": {
"allow-plugins": {
"php-http/discovery": true
}
},
"require": {
"php-imap/php-imap": "^5.0",
"phpmailer/phpmailer": "^6.8",
"openai-php/client": "^0.6.4",
"symfony/http-client": "^6.3",
"nyholm/psr7": "^1.8"
}
}
型
如果我从第二行删除Namespace PhpImap,它的工作,但它需要我的imap函数。我认为命名空间与OpenAi库冲突。我不知道如何解决这个问题。让我知道如果有人可以帮助我解决这个问题。谢谢你,谢谢
2条答案
按热度按时间gajydyqb1#
OpenAI
类没有命名空间,这意味着在使用它时需要使用\
作为前缀:字符串
bqujaahr2#
您可能需要通读the explanation of namespaces in the PHP manual以理解关键概念。
一种思考方法是,类的全名可以由
\
分隔,所有的命名空间机制只是通过较短的名称引用类的方式。简单地说,有两种方式:namespace
关键字为特定文件中的所有类指定默认前缀use
关键字指定了该规则的特殊例外情况,其中短名称引用具有不同前缀的内容重要的是,这两条规则优先于查找根本没有名称空间前缀的类。要说你不想添加任何前缀,你必须用一个前导
\
来创建一个“完全限定”的名字。在本例中,要使用的类的全名是
OpenAI
,没有前缀,但您已经告诉PHP在默认情况下添加前缀PhpImap
,因此它正在查找PhpImap\OpenAI
。您需要:\OpenAI
use
语句use OpenAI;
,告诉编译器您希望OpenAI
在整个文件中引用该类