命名空间导致PHP致命错误:未捕获错误:找不到类错误[重复]

8hhllhi2  于 2023-08-02  发布在  PHP
关注(0)|答案(2)|浏览(129)

此问题在此处已有答案

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库冲突。我不知道如何解决这个问题。让我知道如果有人可以帮助我解决这个问题。谢谢你,谢谢

gajydyqb

gajydyqb1#

OpenAI类没有命名空间,这意味着在使用它时需要使用\作为前缀:

$client = \OpenAI::client($yourApiKey);

字符串

bqujaahr

bqujaahr2#

您可能需要通读the explanation of namespaces in the PHP manual以理解关键概念。
一种思考方法是,类的全名可以由\分隔,所有的命名空间机制只是通过较短的名称引用类的方式。简单地说,有两种方式:

  • namespace关键字为特定文件中的所有类指定默认前缀
  • use关键字指定了该规则的特殊例外情况,其中短名称引用具有不同前缀的内容

重要的是,这两条规则优先于查找根本没有名称空间前缀的类。要说你不想添加任何前缀,你必须用一个前导\来创建一个“完全限定”的名字。
在本例中,要使用的类的全名是OpenAI,没有前缀,但您已经告诉PHP在默认情况下添加前缀PhpImap,因此它正在查找PhpImap\OpenAI。您需要:

  • 指定为\OpenAI
  • 在文件顶部添加一个use语句use OpenAI;,告诉编译器您希望OpenAI在整个文件中引用该类

相关问题