0

エラーを処理し、エラーコードを指定して適切なエラーメッセージを出力するために、Exceptionクラスの子クラスを作成しようとしています。元のコードを変更して、問題を説明するためだけに簡単にしました。

おそらくそれは不可能ですが、InvalidEmailExceptionクラスがスクリプトによってインスタンス化されることを望んでいません。必要に応じてSubscribeクラスで使用したいだけです(エラーが見つかりました)。とにかくこれをやりたいのはなぜですか?クラスがどのように機能するかを理解しようとしているだけでも構いません。

/* Child class from the parent Exception class to handle errors 
 * pertinent to users being subscribed
 */
class InvalidEmailException extends Exception{
   private $error_code;
   private $email;
   function __construct($error_code, $email){
      $this->error_code = $error_code;
      $this->email = $email;
      $this->notifyUser();
   }
   function notifyUser(){
        if($this->error_code == 2):
         echo "<p>Invalid email: <em>{$this->email}</em></p>";
      endif;
   }
}

// Initial class to subscribe a user with the try catch checks
class Subscribe{
   private $email;
   private $error_code = 0;
   function __construct($email){
      $this->email = $email;
      $this->validateEmail();
   }

   private function validateEmail(){
      try{
         if($this->email == ''):
            throw new Exception('<p>Error: empty email address.</p>');
         else:
            if($this->email == 'invalid test'){
                    $this->error_code = 2;
               throw new InvalidEmailException($this->error_code, $this->email);
            }elseif($this->error_code == 0){
               // Go to method to subscribe a user if the error code remains zero
               $this->subscribeUser();
            }
         endif;
      }catch(Exception $e){
         echo $e->getMessage();
      }
   }

   private function subscribeUser(){
      echo $this->email.' added to the database!';
   }
}

/* 
 * Script to use the Subscribe class, which would call 
 * the InvalidEmailException class if needed
 */
$email = 'invalid test'; // This could later on be used through the $_POST array to take an email from a form
$subscribe = new Subscribe($email); // Works well.
$test = new InvalidEmailException('2', 'a@b.c'); // Also works.  I want this to throw an error.
4

3 に答える 3

2

いいえ、実際には、PHP で「これまですべてに可視」以外の種類のクラス可視性を持つことはできません。人々があなたに言ったように、さまざまなハックを使用して部分的に近似することができますが、可視性の制約を強制できないため、無意味な時間の無駄です (プログラマーが疑似制約に違反したい場合は、すべて簡単な回避策の対象となります)。強制されない場合は、プログラマー レベルで実装することもできます (つまり、実装する必要がないと思う場合は、実装しないでください)。

あなたの懸念が、使用が非常に制限された例外クラスでグローバルクラスの名前空間を汚染することである場合 (これは、私があなたに拍手を送る正当な懸念です)、それが名前空間の目的です。典型的なプロ仕様の PHP 5.3 アーキテクチャーでは、クラスはYourApp\Email\SubscribeとのようになりYourApp\Email\InvalidAddressExceptionます。(ちなみに、ステートメントまたは完全な名前空間の指定を必要とせずに、内部Subscribeのコードが をスローできるようにします。)new InvalidAddressExceptionuse

于 2012-07-08T02:42:17.523 に答える
1

あなたの最善の選択肢は、依存性注入http://en.wikipedia.org/wiki/Dependency_injectionを使用することだと思います。少し高度ですが、長期的には役立つと思います..

基本的に、必要なデータを取得するメソッドを使用して共通のインターフェイスを作成し、例外クラスのコンストラクターにインターフェイスの型のパラメーターを持たせることができます。次に、サブスクライブ クラスにインターフェイスを実装させます。これにより、例外のコンストラクターに渡すことができます。

サブスクライブ オブジェクトを例外クラスのコンストラクターにパラメーターとして直接渡し、インターフェイスの使用をバイパスすることもできます。ただし、インターフェイスを使用すると、複数のクラスですべてそのインターフェイスとそれらの共通メソッドを使用でき、そのパターンを使用した場合、それらはすべて例外クラスを構築できます。また、これらのクラスは同じ共通の設計を使用しているため、それらのクラスとやり取りする方法も知っているでしょう。

これは、クラスの外部およびスクリプト内から例外を構築することを完全に妨げるわけではありませんが、最初にインターフェースを実装するクラスを構築する必要があります (または、どちらの方法を使用するかに応じて、クラス自体のみを構築する必要があります)。動作を制限する良い方法です。

于 2012-07-08T02:30:26.923 に答える
-1

ここに考えがあります。

define を使用して、「グローバル化された」変数を設定します。

したがって、Subscribe クラスの __construct 関数で次のような変数を設定し、define( 'IN_USE', 1 );その InvalidEmailException が呼び出された場合は次のことを確認します。

if( !IN_USE ) { exit; }
于 2012-07-08T02:33:05.983 に答える