2009-07-24 5 views
0

Ich habe mich nur gefragt, ob es eine Möglichkeit gibt, mein Objekt falsch zurückgeben zu lassen, wenn es in eine if-Anweisung gestellt wird. Der Grund ist, dass ich eine benutzerdefinierte Ausnahmeklasse mache. Ich möchte in der Lage sein, etwas entlang der Linien von dem zu tunWie kann ich ein benutzerdefiniertes Ausnahmeobjekt in einem if-Zustand auf false setzen?

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

Ich verstehe, dass dies ein horrend dumm Beispiel. Der Punkt ist jedoch, dass dieser Test if(seeDog())true für beide Zeichenfolge "Husky" und für das Objekt Dog_Exception auswertet. Wenn es möglich ist, möchte ich Dog_Exception zu false bewerten, wenn in einem if Zustand platziert. Auf diese Weise würde ich zum Beispiel kein Konstrukt wie if(typeof(seeDog()) == Dog_Exception) usw. verwenden müssen. Ich bezweifle, dass dies möglich ist, aber jede Hilfe wäre großartig. Vielen Dank!

+0

Sie Jungs fehlen den Punkt der Frage. Ausnahme war das falsche Objekt zu verwenden. Ändern Sie es in "Ergebnis" oder was auch immer. Der Punkt hat damit nichts zu tun, und ist nur "ist es möglich zu machen und object zurück false, wenn in eine if-Anweisung" – Ethan

+0

Hey alle, weil ich meine Frage dumm formuliert habe, habe ich meine Frage hier drück: http://stackoverflow.com/questions/1182710/is-it-possible-to-make-an-object-return-false-by-default Dank denen, die geholfen haben. – Ethan

Antwort

5

Warum geben Sie eine Ausnahme zurück? Solltest du es nicht werfen?

+0

+1. Was genau soll lookAround() zurückgeben? Ein Faden? Ein Boolescher? Eine Ausnahme? – thedz

+0

Alles, was ich will, ist ein Objekt, lassen Sie es DogObject, dass, wenn ich eingeben $ Dog = new DogObject(); if (! $ Hund) { echo "Yay, $ Hund kehrte falsch!". } Echo "yay ...". Im Wesentlichen möchte ich wissen, ob es möglich ist, ein Objekt falsch zurückgeben zu lassen. – Ethan

3

was ist mit so etwas wie ein Versuch zu fangen? Sie müssen die Ausnahme nicht zurückgeben.

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"; 
} 

über: 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

Es sollte "neue Dog_Exception (no_see);" werfen, es sei denn, "Dog_Exception" ist eine Funktion, die eine Instanz von 'Dog_Exception' zurückgibt. –

0

ich versuchte, dies selbst zu tun und eine Lösung gefunden, die zu funktionieren scheint.

Als Antwort auf die anderen, die versuchten, die Frage zu beantworten, indem sie dem Fragesteller sagten, eine andere Lösung zu verwenden, werde ich auch versuchen, den Grund für die Frage zu erklären. Weder das ursprüngliche Poster noch ich möchte eine Ausnahme verwenden, da es nicht darum geht, Ausnahmebehandlungsfunktionen zu verwenden und diese Belastung auf irgendeinen Code, in dem wir diese Klasse verwenden, zu legen. Der Punkt, zumindest für mich, war, dass ich dies nutzen konnte Klasse nahtlos in anderen PHP-Code, der in einem nicht-objektorientierten oder nicht-Exception-basierten Stil geschrieben werden kann. Viele eingebaute PHP-Funktionen sind so geschrieben, dass ein Ergebnis von false für nicht erfolgreiche Prozesse wünschenswert ist. Gleichzeitig möchten wir vielleicht in der Lage sein, dieses Objekt in unserem eigenen Code auf besondere Weise zu handhaben.

Zum Beispiel könnten wir wollen, wie etwas zu tun ist:

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. 
} 

Hier ist eine sehr einfache Implementierung.

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.'; 
} 

// I $ falsch bin Druck nur um sicher nichts zu machen unerwartetes geschieht.

Die Ausgabe lautet:

falsch ist. ist wirklich falsch.

ich dies habe getestet und es funktioniert auch, wenn Sie einige deklarierten Variablen innerhalb der Klasse haben, wie zum Beispiel:

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

class CustomException extends FalseException { } 

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

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

Eine etwas interessante Umsetzung sein könnte

Unter Verwendung des gleichen Testcodes wie zuvor wird $ false zu false ausgewertet.

+0

Leider funktioniert diese Methode nicht auf meiner PHP-Installation. (php v5.3.5) –

+0

Anscheinend änderten sie es so, wenn Sie Mitgliedsvariablen haben, wird es als wahr ausgewertet. –

Verwandte Themen