【问题标题】:Using Namespaces within Class Methods in PHP在 PHP 的类方法中使用命名空间
【发布时间】:2018-01-26 18:25:48
【问题描述】:

我更愿意创建一个可以处理 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();

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

--- 编辑添加:

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

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

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

【问题讨论】:

  • 从表面上看,您的示例看起来不错。请添加一些关于“我无处可去”和“我没有任何运气”的信息。问题的症状很重要。
  • 那么...怎么了?
  • 奇怪的是清理它,它工作得更好,但现在说:“无法打开 phar:///aws.phar/Aws/S3/Resources/s3-latest.php供阅读”

标签: php amazon-web-services oop namespaces traits


【解决方案1】:

好吧,当我将它上传到服务器时,结果证明它工作得很好,但是在 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 能够在此设置中毫无问题地查看这些类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 2013-12-28
    • 2019-06-02
    • 2015-07-28
    • 2012-12-26
    相关资源
    最近更新 更多