在 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 文件夹(AWS
、GuzzleHttp
、Psr
、JmesPath
)直接添加到 classes
文件夹。 Zend Studio 能够在此设置中毫无问题地看到这些 类。
我更愿意创建一个可以处理 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 文件夹(AWS
、GuzzleHttp
、Psr
、JmesPath
)直接添加到 classes
文件夹。 Zend Studio 能够在此设置中毫无问题地看到这些 类。