2016-06-30 13 views
0

エラー処理については、数日前に同様の質問をしました。人々はクラスからエラーを得る方法を私に説明しました。複数の関数からのクラスのPHPエラー処理

include 'class.php'; 
    try { 
     $test = new magic('', '', '33'); 
     $test->printFullname(); 
    } catch (Exception $exc) { 
     echo $exc->getMessage(); //error messages 
    } 

それは動作しますが、このクラスの別の関数での問題:

と私は

class magic 
{ 
    /** 
    * @param string $name 
    * @param string $surname 
    * @param int $age 
    * @throws Exception 
    */ 
    public function __construct($name, $surname, $age) 
    { 
     $errors = []; 

     if (empty($name)) { 
      $errors[] = 'Name is required.'; 
     } 

     if (empty($surname)) { 
      $errors[] = 'Surname is required.'; 
     } 

     if (!empty($errors)) { 
      throw new Exception(implode('<br />', $errors)); 
     } 

     $this->name = $name; 
     $this->surname = $surname; 
     $this->age = $age; 
    } 

    public function printFullname() 
    { 
     echo $this->name . ' ' . $this->surname; 
    } 

} 
別のファイルをどのようにエラー名を作成し、 __constructセクションに検証するためにそれを理解するが、それでも複数の機能に苦しんで

class magic 
    { 
     /** 
     * @param string $name 
     * @param string $surname 
     * @param int $age 
     * @throws Exception 
     */ 
     public function __construct($name, $surname, $age) 
     { 
      $errors = []; 

      if (empty($name)) { 
       $errors[] = 'Name is required.'; 
      } 

      if (empty($surname)) { 
       $errors[] = 'Surname is required.'; 
      } 

      if (!empty($errors)) { 
       throw new Exception(implode('<br />', $errors)); 
      } 

      $this->name = $name; 
      $this->surname = $surname; 
      $this->age = $age; 
     } 

     public function printFullname() 
     { 
      echo $this->name . ' ' . $this->surname; 
     } 

public function auth() 
{ 
//authentication goes here 

if... 
$errors[] = 'Error1'; 
else 
$errors[] = 'Error2'; 
etc... 

} 


} 

別のファイル:

include 'class.php'; 
     try { 
      $test = new magic('', '', '33'); 
      $test->auth(); 
     } catch (Exception $exc) { 
      echo $exc->getMessage(); //error messages 
     } 

私の関数auth()は動作していて、echoと同じようにエラーを返しますが、私は配列を使いたいと思います。

+0

を呼び出します'$ test = new magic( ''、 ''、 '33');コンストラクタは例外をスローし、インスタンス化されたオブジェクトを返すことはありません。したがって、 '$ test'はnullになり、' $ test-> auth(); 'はまったく実行されません。例外はユーザーの入力エラーを処理する最善の方法ではないかもしれません。 – feeela

+0

@feeelaだから、もしあなたが単純ならば、echo '';各機能で? –

+0

いいえ、必要な引数が期待どおりでない場合、コンストラクタで[InvalidArgumentException'をスローすることができます(http://php.net/InvalidArgumentException)。しかし 'auth()'のようなメソッドはステータスコードを返さなければなりません。クライアントにいくつかの有用なエラーメッセージを提示したい場合があるので、クラス自体にエラーテキストを格納することは最善の方法ではありません。エラーコードを返すと、さまざまな言語でメッセージを表示することができます。しかし、型付き例外(@GiamPyの回答を参照)を使用するというアイデアも機能します。 – feeela

答えて

1

あなたがやっていることは不要だと思います。

コンストラクタパラメータを記述した方法では、デフォルト値を設定していないため、これらのパラメータが必須であり、空であってはならないということが自動的に示されます。

複数の機能のエラーについては、カスタム例外を参照することをお勧めします。特定のエラーごとにカスタム例外を作成し(異なるアクションや異なるタイプのエラーを適用する必要がある場合)、Exceptionと同じように例外をキャッチします。

0

あなたがあなた自身の例外クラスを作成する必要があります配列として例外からエラーを取得したい場合:

class MagicException extends Exception 
{ 
    private $errors; 

    function __construct($message, array $errors, $code = 0, Exception $previous = null) 
    { 
     parent::__construct($message, $code, $previous); 
     $this->errors = $errors; 
    } 

    function getErrors() 
    { 
     return $this->errors; 
    } 
} 

使用法:

try { 
    $errors = []; 

    // some code.. 
    $errors[] = 'Example error'; 

    if ($errors) { 
     throw new MagicException('Something went wrong', $errors); 
    } 
} catch (MagicException $e) { 
    // @todo: handle the exception 
    print_r($e->getErrors()); 
} 

出力:

Array 
(
    [0] => Example error 
) 
関連する問題