在 Class 中使用命名空间 PHP 中的方法

Using Namespaces within Class Methods in PHP

我更愿意创建一个可以处理 AWS PHP SDK 调用的 class,而不必根据需要进行内联设置。给出这个例子:

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();}

最终,我想要一个像这样的 class 文件(最接近的猜测):

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();

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

---编辑添加:

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

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

它执行到 $this->s3 = Aws\S3\S3Client::factory 并捕获标准 Exception 并显示错误消息。

好吧,事实证明当我将它上传到服务器时它工作得很好,但是当在 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-autoloader.php,只需调用这个新的精简版本 aws_init.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 文件夹(AWSGuzzleHttpPsrJmesPath)直接添加到 classes 文件夹。 Zend Studio 能够在此设置中毫无问题地看到这些 类。