2009-07-24 2 views
0

ifステートメントに置かれたオブジェクトがfalseを返すようにする方法があるかどうかは不思議でした。理由は、私はカスタム例外クラスを作っているからです。私は、これは恐ろしく愚かな例であることを理解し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())テストでは、文字列 "husky"とDog_Exceptionオブジェクトの両方について、trueと評価されます。はifの状態に置いた場合、可能であればfalseと評価したいと思います。そうすれば、たとえば、if(typeof(seeDog()) == Dog_Exception)などのような構造を使う必要はありません。私はこれが可能だとは思っていませんが、助けがあれば助かります。ありがとう!

+0

質問のポイントが不足しています。例外は使用するオブジェクトが間違っていました。それを「結果」などに変更します。その点はそれとは関係がなく、単に "if文を書くとfalseを返すことができますか?" – Ethan

+0

私の質問を愚かに語ったので、皆さん、私はここで質問をしました: /stackoverflow.com/questions/1182710/is-it-possible-to-make-an-object-return-false-by-default 困っている人に感謝します。 – Ethan

答えて

5

なぜ例外が返されますか?あなたはそれを投げてはいけませんか?

+0

+1。 lookAround()が返す正確なものは何ですか?文字列?ブール値?例外? – thedz

+0

私が欲しいのは、オブジェクトです。私が入力した場合、それをDogObjectと呼ぶことができます。 $ dog = new DogObject(); if(!$ dog) { echo "よ、$ dogが偽を返しました!" } エコーの「はい...」基本的には、オブジェクトをfalseに戻すことが可能かどうかを知りたい。 – Ethan

3

try catchのようなものはどうですか?それを返さない例外をスローする必要があります。

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

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); 
     } 
    } 
} 
+0

'Dog_Exception'が' Dog_Exception'のインスタンスを返す関数でない限り、 'throw new Dog_Exception(no_see);'にする必要があります。 –

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と評価されます。

+0

不幸にも、この方法は私のPHPインストールでは機能しません。 (PHP v5.3.5) –

+0

彼らはそれを変更したように見えるので、メンバ変数があれば、それは真と評価されます。 –

関連する問題