2013-08-29 4 views
0

Я использую простую электронную почту службу Amazon, и я пытаюсь реализовать его как абстрактный класс, так что я могу просто использовать его в течение по мере необходимости.PHP Amazon Ses как абстрактный класс дает использование фатальной ошибке

Проблема

Проблема возникает при использовании, я не могу работать, как требовать файлов и классов, необходимых для использования 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 <[email protected]>', 
       '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 ...

Решение?

Как я могу использовать/требует файлов, мне нужно, чтобы получить эту работу внутри абстрактного класса?

+0

Пут '' использование ... вне классов, в начале файла –

ответ

4

Это не работает:

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

use заявление, в основном, импорт, которые обрабатываются во время компиляции, поэтому они не могут быть ограничены. Они должны перемещаться во внешний охват (вне класса).
Если вы хотите их охватить, вам необходимо будет либо, либо вручную require их, либо использовать class_alias.
Check my answer to this question для получения более подробной информации. Еще более подробную информацию можно, как всегда, можно найти on php.net

Побочные примечания:

  • Пожалуйста, следовать стандартам кодирования, как описано PHP-FIG. Они не официальные, но Zend, Symfony ... все основные игроки, по сути, подписываются на них.
  • Пожалуйста, получите в Habbit из всегда с указанием accessmodifiers (public, protected и private)
  • При создании экземпляров, как вы делаете $client = SesClient::factory, присваивают их в собственность, чтобы только создать экземпляр один раз. На данный момент каждый вызов метода создает один и тот же экземпляр снова и снова. Это плохо
  • При использовании своих свойств: include them in the class definition!
  • Вы звоните sendEmail на экземпляре, и присвоить возвращаемое значение $send. Вы не проверяете возвращаемое значение и не возвращаете его. Либо проигнорируйте возвращаемое значение, либо верните его, чтобы его можно было проверить!
  • Никогда не используйте require, используйте require_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; 
    } 
} 
+0

Если я вобще 'use' я получаю бесчисленное множество ошибки, связанные с другими неудачами использования? – Dan

+0

@ Silver89: Это потому, что вам необходимо зарегистрировать автозагрузчик (используя 'spl_autoloader_register'), который может разрешать пространства имен к их соответствующим путям. Поскольку вы используете 'require' для включения функции автозагрузчика (возможно, для старой школы' __autoload'), во время компиляции нет автозагрузчика. Честно: зарегистрируйте автозагрузчик _before_, создав один экземпляр (или создайте экземпляр, который регистрирует один из его методов в качестве автозагрузчика). Также запустите файл, содержащий этот класс, с помощью 'namespace YourNameSpace \ If \ A \ NS \ Applies;' –

+0

Просто прочитайте документацию по работе с пространствами имен (и убедитесь, что вы используете PHP> = 5.3. Если нет, пространства имен не доступно –