0

我正在使用 Amazon Simple Email Service 并尝试将其实现为抽象类,以便我可以根据需要在整个过程中简单地使用它。

问题

使用时出现问题,我无法弄清楚如何要求将所需的文件和类Ses用作抽象类而不会产生错误。

require 'lib/aws/aws-autoloader.php';

use Aws\Common\Enum\Region;
use Aws\Ses\SesClient;

abstract class simpleemail {

    function sendSesEmail($to, $subject, $body, $bodyHtml){

        try {   
            $client = SesClient::factory(array(
                'key' => "",
                'secret' => "",
                'region' => Region::US_EAST_1
            ));

            $send = $client->sendEmail(array(
                'Source' => 'Name <no-reply@contact.com>',
                'Destination' => array('ToAddresses' => array($to)),
                'Message' => array('Subject' => array('Data' => $subject), 'Body' => array('Html' => array('Data' => $bodyHtml)))));

            return true;
        }
        catch(Exception $e){
            echo $e->getMessage();
            return false;
        }
    }
}

错误信息

Fatal error: Class 'Aes\Ses\SesClient' not found in ....

我尝试将其更改use为要求,但随后得到:

require 'lib/aws/Aws/Common/Enum/Region.php';
require 'lib/aws/Aws/Ses/SesClient.php';

Fatal error: 'SesClient' not found in ...

解决方案?

我如何使用/需要我需要的文件才能在抽象类中工作?

4

1 回答 1

5

这不起作用:

abstract class simpleemail
{
    public function sendSesEmail()
    {
        use Aws\Common\Enum\Region;
        use Aws\Ses\SesClient;
        //...
    }
}

use语句基本上是在编译时处理的导入,因此它们不能限定范围。他们必须移动到外部范围(类之外)。
如果您想确定它们的范围,您必须手动使用它们,require或者使用class_alias.
查看我对这个问题的回答以获取更多详细信息。与以往一样,可以在 php.net上找到更多详细信息

旁注:

  • 请遵循PHP-FIG描述的编码标准。它们不是官方的,但 Zend、Symfony ......事实上,所有主要参与者都订阅了它们。
  • 请养成始终指定访问修饰符 ( public,protectedprivate)的习惯
  • 当像你一样创建实例时$client = SesClient::factory,将它们分配给一个属性,只创建一次实例。目前,每个方法调用都会一遍又一遍地创建相同的实例。那很糟
  • 使用属性时:将它们包含在类定义中
  • 您正在调用sendEmail一个实例,并将返回值分配给$send. 您不检查返回值,也不返回它。要么忽略返回值,要么返回,所以可以检查!
  • 千万不要用requirerequire_once必要时用。require两次执行相同的代码块时使用可能会导致错误:重新声明函数/类。如果时间至关重要,您可以选择require(因为require_once会导致更多开销),但您必须知道自己在做什么。
  • 不要require自动加载器,使用spl_autoloader_register
  • 记住:抽象类不能实例化,只能实例化它们的子类……子类也可以重写抽象类中声明的方法。将关键方法声明为final

所以,答案:

use Aws\Common\Enum\Region;
use Aws\Ses\SesClient;
abstract class simpleemail
{
    protected $client = null;
    final public function sendSesEmail()
    {
        $client = $this->getClient();//lazy-loads the client instance
        return $client->sendEmail(/* ... */);//return the result
    }
    //lazy-loader
    protected function getClient()
    {
        if ($this->client === null)
        {
            $this->client = SesClient::factory(array(
                'key' => "",
                'secret' => "",
                'region' => Region::US_EAST_1
            ));
        }
        return $this->client;
    }
}
于 2013-08-29T14:05:16.500 回答