0

ifステートメントに配置された場合にオブジェクトがfalseを返すようにする方法があるかどうか疑問に思っていました。その理由は、カスタム例外クラスを作成しているためです。私はの線に沿って何かをしたいです

class Dog{

   public function lookAround()
   {
        if(seeDog())
        {
            return bark;
        }
        else
        {
            return sit;
        }
   }

   public function seeDog()
   {
        if(object == Dog)
        {
             return "husky";
        } 
        else
        {
             return Dog_Exception(no_see);
        }
   }
} 

これは恐ろしくばかげた例だと理解しています。ただし、重要なのは、このオブジェクトが立っているとき、if(seeDog())テストはtrue文字列「ハスキー」とDog_Exceptionオブジェクトの両方を評価するということです。可能であれば、条件が整っていれば、Dog_Exceptionと評価したいと思います。そうすれば、たとえば、などのような構成を使用する必要はありません。これが可能かどうかは疑問ですが、どんな助けでも素晴らしいでしょう。ありがとう!falseifif(typeof(seeDog()) == Dog_Exception)

4

4 に答える 4

5

なぜ例外を返すのですか?あなたはそれを投げるべきではありませんか?

于 2009-07-24T21:40:13.743 に答える
3

トライキャッチのようなものはどうですか?例外を返すのではなく、スローする必要があります。

function inverse($x) {
if (!$x) {
    throw new Exception('Division by zero.');
}
    else return 1/$x;
}

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

経由: http: //us3.php.net/manual/en/language.exceptions.php

于 2009-07-24T21:41:09.950 に答える
1
class Dog{

   public function lookAround()
   {
        try
        {
            if(seeDog())
            {
                return bark;
            }           
        }
        catch(Dog_Exception $e)
        {
            return sit;
        }
   }

   public function seeDog()
   {
        if(object == Dog)
        {
             return "husky";
        } 
        else
        {
             throw Dog_Exception(no_see);
        }
   }
}
于 2009-07-24T21:46:55.760 に答える
0

私はこれを自分でやろうとしていて、うまくいくように見える解決策を見つけました。

質問者に別の解決策を使用するように言って質問に答えようとしていた他の人たちに応えて、私は質問の理由も説明しようとします。元の投稿者も私も例外を使用したくないのは、例外処理機能を使用せず、このクラスを使用するコードにその負担をかけるためです。少なくとも私にとっては、これを使用できるようにすることが重要でした。非オブジェクト指向または非例外ベースのスタイルで記述される可能性のある他のPHPコードでシームレスにクラス化されます。多くの組み込みPHP関数は、失敗したプロセスに対してfalseの結果が望ましいように記述されています。同時に、このオブジェクトを独自のコードで特別な方法で処理できるようにしたい場合があります。

たとえば、次のようなことをしたいと思うかもしれません。

if ( !($goodObject = ObjectFactory::getObject($objectType)) ) {
  // if $objectType was not something ObjectFactory could handle, it
  // might return a Special Case object such as FalseObject below
  // (see Patterns of Enterprise Application Architecture)
  // in order to indicate something went wrong.
  // (Because it is easy to do it this way.)
  //
  // FalseObject could have methods for displaying error information.
}

これは非常に単純な実装です。

class FalseObject {
  public function __toString() {
    // return an empty string that in PHP evaluates to false
    return '';
  }
}

$false = new FalseObject();

if ( $false ) {
  print $false . ' is false.';
} else {
  print $false . ' is true.';
}

print '<br />';

if ( !$false ) {
  print $false . ' is really true.';
} else {
  print $false . ' is really false.';
}

//予期しないことが起こっていないことを確認するために、$falseを出力しています。

出力は次のとおりです。

は偽です。本当に間違っています。

私はこれをテストしましたが、クラス内に次のような宣言された変数がある場合でも機能します。

class FalseObject {
  const flag = true;
  public $message = 'a message';
  public function __toString() {
    return '';
  }
}

もう少し興味深い実装は次のとおりです。

class FalseException extends Exception {
  final public function __toString() {
    return '';
  }
}

class CustomException extends FalseException { }

$false = new CustomException('Something went wrong.');

以前と同じテストコードを使用すると、$falseはfalseと評価されます。

于 2009-08-16T02:03:31.537 に答える