Php Amazon S3:未捕获错误:未找到类“S3Client”

Php Amazon S3:未捕获错误:未找到类“S3Client”,php,amazon-s3,Php,Amazon S3,我正在尝试将.zip文件上载到Amazon S3服务,但不断出现错误: 未捕获错误:在/Class/database.Class.php:411中找不到类'S3Client' 这是守则的基础。我无法尝试调试。类_exists函数指定的是S3Client exists和echo的类!!!转到页面。 我在amazon自动加载文件中添加了一个echo语句,它是echo,因此它正在查找自动加载文件 为什么PHP在尝试调用该类时找不到该类 我的亚马逊课堂 需要_once$path[full]./asset

我正在尝试将.zip文件上载到Amazon S3服务,但不断出现错误:

未捕获错误:在/Class/database.Class.php:411中找不到类'S3Client'

这是守则的基础。我无法尝试调试。类_exists函数指定的是S3Client exists和echo的类!!!转到页面。 我在amazon自动加载文件中添加了一个echo语句,它是echo,因此它正在查找自动加载文件

为什么PHP在尝试调用该类时找不到该类

我的亚马逊课堂

需要_once$path[full]./assets/vendor/amazon-s3/aws autoloader.php'; 使用Aws\S3\S3客户端; 亚马逊3级{ //为以后使用构建一些函数提供帮助。 } 我的自动加载

//上述其他功能 包括“/path/to/amazon-s3.class.php” //其他功能如下 内部备份数据库功能

包括“/path/to/my/my autoload.class.php”; 如果类_存在“Aws\S3\S3Client”{ 回声类!!!; /*第411行*/$s3=新的s3客户端[ '版本'=>'最新', “地区”=>“美国西部-2” ]; } 否则{ 无回声类; } exit0; 试一试{ $s3->putObject[ “Bucket”=>$data[domain], “键”=>“我的对象”, 'Body'=>fopen$zipName,'r', “ACL”=>“公共读取”, ]; }捕获Aws\S3\Exception\S3Exception$e{ echo上载文件时出错。\n; } 更新 我没有使用作曲家;我下载了软件包并将其上传到我的服务器

我仍然没有机会让它识别S3Client类。我在amazon包中的类正上方的S3Client.php顶部添加了一个echo,以查看它是否包含,是否包含,并在我的页面上回显了字符串,因此据我所知,所有amazon类文件都包含在内

更新2 我将include文件添加到Amazon autoloader的include中。

在您的class_exists调用中,您可以使用其命名空间指定完全限定的类名:

     if(class_exists('Aws\S3\S3Client')) {
        echo "CLASS!!!";
    }
但当您尝试实例化它时,只使用类名:

        /* Line 411 */ $s3 = new S3Client([
            'version' => 'latest',
            'region'  => 'us-west-2'
        ]);            
请注意,错误消息不包括名称空间Aws\S3,因为PHP不知道S3Client实际上应该是指Aws\S3\S3Client

如果使用完全限定名实例化该类,它将工作:

        /* Line 411 */ $s3 = new Aws\S3\S3Client([
            'version' => 'latest',
            'region'  => 'us-west-2'
        ]);            
要将名称S3Client扩展为Aws\S3\S3Client,您的代码需要位于Aws\S3命名空间内;或者在文件顶部有一个适当的use语句

需要记住的重要一点是,namespace和use语句只影响当前文件,不能通过require/include加载它们

因此,这也将起作用:

/* top of file */
use Aws\S3\S3Client;
// ...
        /* Line 411 */ $s3 = new S3Client([
            'version' => 'latest',
            'region'  => 'us-west-2'
        ]);            
您为类使用的名称在每个文件中都可能不同,请使用。。。因此,您也可以这样做:

/* top of file */
use Aws\S3\S3Client as AmazonS3;
use Something\Else as S3Client;
// ...
        /* Line 411 */ $s3 = new AmazonS3([
            'version' => 'latest',
            'region'  => 'us-west-2'
        ]);            
要查看PHP在特定文件中将裸类名解析为什么,可以使用magic::class后缀,该后缀仅根据当前名称空间扩展名称,并使用规则,即使实际上没有具有该名称的类:

if ( class_exists(S3Client::class) ) {
    echo 'Class exists: ' . S3Client::class;
}
else {
    echo 'Class does not exist: ' . S3Client::class;
}

当您希望在字符串中使用完全限定的类名时,这几乎总是您想要做的。

我假设您正在使用Composer作为依赖项,如果是,请确保在php文件中添加autoload.phpfile。您假设错误。我下载了压缩文件并上传了文件。我的主机没有安装composer。这些文件包含在我的文件中。与其有人投票否决我的问题,至少告诉我你为什么投票否决它,这样我可以改进我的问题。为什么不使用内置的linux工具(如wget)下载composer phar文件?乱动zip文件是浪费时间。而且,从你上传的代码来看,没有迹象表明你包含了S3Client类的文件。这是目前为止最好的解释。我使用PHPMailer在中使用了名称空间,但我在同一个文件中声明了一个变量,这样我就可以在包含它时访问它。我要试一试