代码之家  ›  专栏  ›  技术社区  ›  Exit

在PHP中的类方法中使用名称空间

  •  1
  • Exit  · 技术社区  · 6 年前

    我宁愿创建一个可以处理AWS PHP SDK调用的类,而不必根据需要进行内联设置。举个例子:

    require('aws.phar');
    
    use Aws\S3\S3Client;
    use Aws\Exception\AwsException;
    use Aws\S3\Exception\S3Exception;
    
    $region = 'us-east-1';
    
    try {
     $s3 = S3Client::factory(array(
      'credentials' => array(
       'key' => AWS_ACCESS_KEY_ID,
       'secret' => AWS_SECRET_ACCESS_KEY),
      'region' => $region,
      'version' => 'latest'
     ));
    
     print_r($s3->listBuckets());
    
    }
    catch (S3Exception $e) {echo $e->getMessage();}
    catch (AwsException $e) {echo $e->getAwsErrorType().' '.$e->getAwsErrorCode();}
    catch (Exception $e) {echo $e->getMessage();}
    

    最终,我希望有这样一个类文件(最接近的猜测):

    require_once('aws.phar');
    
    class S3 {
    
     private $region = 'us-east-1';
     private $s3;
    
     public function create() {
      try {
       $this->s3 = Aws\S3\S3Client::factory(array(
        'credentials' => array(
         'key' => AWS_ACCESS_KEY_ID,
         'secret'   => AWS_SECRET_ACCESS_KEY),
        'region' => $this->region,
        'version' => 'latest'
       ));
      }
      catch (Aws\Exception\AwsException $e) {echo $e->getMessage();}
      catch (Aws\S3\Exception\S3Exception $e) {echo $e->getAwsErrorType().' '.$e->getAwsErrorCode();}
      catch (Exception $e) {echo $e->getMessage();}
     }
    
     public function list() {
      if (!$this->s3) return false;
    
      return $this->s3->listBuckets();
     }
    
    }
    
    $s3 = new S3();
    $s3->create();
    $s3->list();
    

    我一直在寻找解决方案,但我一事无成。我认为最接近的是使用特征,但话说回来,我以前从未使用过它们,所以我没有任何运气。

    ---编辑以添加:

    我没有注意到发生了什么错误,但在创建这个示例后,我的一些初始错误消失了。我不确定范围将如何与 require_once 在类的外部,我尝试了各种方法,因为我认为类无法看到AWS名称空间。显然情况并非如此,因为我可以运行测试脚本,但它会返回:

    Unable to open phar://<path_omitted>/aws.phar/Aws/S3/Resources/s3-latest.php for reading
    

    它执行多达 $this->s3 = Aws\S3\S3Client::factory 并符合标准 Exception 并显示错误消息。

    1 回复  |  直到 5 年前
        1
  •  0
  •   Exit    5 年前

    好的,当我将其上载到服务器时,结果证明这非常有效,但在IDE(Zend Studio/Eclipse)中测试时,它试图通过完整的文件路径进行访问,而该文件路径触发了权限错误。

    我怀疑Zend/Eclipse的权限和phar包存在一些问题。不过,我不确定有什么解决方案可以让它在IDE中工作。


    一年后编辑,添加了一个全面的答案:

    用压缩文件版本(解压缩)替换phar与Zend Studio完美配合。您可以使用AWS autoloader.php 文件,但如果您不想与自己的自动加载器发生冲突,请使用 spl_autoload_register ,我建议创建一个文件副本,以删除其自动加载程序:

    我放置了一个名为 aws_init.php 位于与 aws-autoloader.php 他们的自动装弹机脱掉了:

    require __DIR__ . '/Aws/functions.php';
    require __DIR__ . '/GuzzleHttp/functions_include.php';
    require __DIR__ . '/GuzzleHttp/Psr7/functions_include.php';
    require __DIR__ . '/GuzzleHttp/Promise/functions_include.php';
    require __DIR__ . '/JmesPath/JmesPath.php';
    

    代替呼叫 aws自动加载器。php ,只需调用此新的精简版本 aws\u初始化。php 确保加载所有函数。

    对于自动加载器,我使用以下方法:

    spl_autoload_register(function ($class_name) {
     if (strpos($class_name,'\\') !== false) $class_name = str_replace('\\','/',$class_name);
     if (file_exists('inc/classes/'.$class_name.'.php')) {
      include('inc/classes/'.$class_name.'.php');
      return;
     }
    
     die('Unable to autoload class: inc/classes/'.$class_name);
    });
    

    当我在AWS文件夹中添加时,这项工作无需任何修改( AWS , GuzzleHttp , Psr , JmesPath )直接发送到 classes 文件夹Zend Studio能够在这个设置中看到这些类而没有问题。