2009-07-25 9 views
1

Ich habe versucht, dies vorher zu fragen, und verwirrte die Frage, also werde ich es erneut versuchen. Ist es möglich, dass ein Objekt standardmäßig false zurückgegeben wird, wenn es in eine if-Anweisung eingefügt wird? Was ich will:Ist es möglich, dass ein Objekt standardmäßig falsch zurückgegeben wird?

$dog = new DogObject(); 
if($dog) 
{ 
    return "This is bad;" 
} 
else 
{ 
    return "Excellent! $dog was false!" 
} 

Gibt es eine Möglichkeit, das ist möglich? Es ist nicht unbedingt notwendig, aber würde mir einige Zeilen Code sparen. Vielen Dank!

+0

Okay, lassen Sie mich ein wenig klären, weil ich denke, in dem Versuch, die Frage zu vereinfachen, Menschen verstehen nicht das Herz davon. Also hier geht: Ich benutze Zend Framework, was bedeutet, dass ich oft Modelle (für diejenigen, die nicht wissen, dass sie im Wesentlichen eine schnelle Möglichkeit zum Einfügen/Aktualisieren/was auch immer mit einer Datenbank) verwenden. Ich rufe zum Beispiel häufig Users> insertNewUser() in einem meiner Controller auf.Wenn es erfolgreich ist, wird ein Zend_Db_Table_Rowset zurückgegeben. Nehmen wir an, dass der Benutzername bereits existiert. Ich möchte nicht einfach falsch zurückkehren, denn das wird mir nicht sagen, was falsch gelaufen ist. – Ethan

+0

Ich liebe diese Frage, weil sie ein Dog-Objekt hat. Haben Sie das Implicit Cast Overloading probiert? –

+0

Stattdessen habe ich ein Objekt namens modelResult erstellt, das den Grund dafür enthält, dass das Modell seine Funktion nicht ausführen konnte. Was ich will ist in der Lage zu sein, zurück in den Controller zu sagen, $ ergebnis = Benutzer-> insertNewUser(). if ($ result) {return $ result} sonst {(CHECK WHAT WITH FALSCH UND SAG WARUM)}. Ich weiß, dass ich dies tun könnte, indem ich den Typ von $ result überprüfe. Ich weiß, dass ich eine Menge Möglichkeiten habe, dies zu tun. Aber ich habe mich nur gefragt, ob ich mein ModelResult-Objekt false zurückgeben könnte, weil es einfach viel einfacher zu verwenden wäre. Gibt es eine Möglichkeit, dies zu tun? Wenn die Antwort nein ist, werde ich es schaffen. – Ethan

Antwort

3

Nein, PHP hat keine Unterstützung für Betreiber Überlastung. Vielleicht fügen sie es in einer zukünftigen Version hinzu.

+0

Okay, das ist alles was ich brauche! Vielen Dank! – Ethan

0

Etwas in "eine if-Anweisung" zu setzen, evaluiert einfach die Variable dort als Boolean. In Ihrem Beispiel müsste $ dog immer false sein, damit das funktioniert. Es gibt keine Möglichkeit zu sagen, wann Ihre Variable in einem booleschen Ausdruck evaluiert werden soll.

Was ist Ihr ultimativer Zweck hier? Welche Codezeilen möchten Sie speichern?

+0

Nun, technisch gibt es Falschheit und Truthy. Wenn Sie z. B. $ string = "" eingeben und dann if ($ string), wird $ string als false betrachtet. Es ist das gleiche mit dem Int 0. Ich habe mich nur gefragt, ob es einen Weg gibt, DogObject falsch zu machen. – Ethan

+1

Okay, ich sehe was du versuchst zu tun. Ich denke, jemand hat das in deinem anderen Thread erwähnt, aber was du wirklich willst, ist ein Versuch/Fang. Sie versuchen die Einfügung und fangen dann alle ausgelösten Ausnahmen ab. – thedz

0

Ich bin mir nicht sicher über das Objekt selbst. Möglich. Sie könnten versuchen, eine öffentliche Eigenschaft zur DogObject-Klasse hinzuzufügen und diese dann standardmäßig auf false festzulegen. Sowie.

class DogObject 
{ 
    var $isValid = false; 

    public function IsValid() 
    { 
     return $isValid; 
    } 
} 

Und dann, wenn Sie es instanziieren würden, wäre es standardmäßig falsch.

$dog = new DogObject(); 
if($dog->IsValid()) 
{ 
    return "This is bad;" 
} 
else 
{ 
    return "Excellent! $dog was false!" 
} 

Nur ein Gedanke.

+0

Ja, aber die Idee ist, dass es eher in Richtung: $ Dog = canReturnDogObjectButCouldAlsoBeArray(); if ($ dog) ... etc. Wenn $ dog nicht unbedingt ein DogObject ist und ich IsValid() darauf anrufe, würde mein Programm abstürzen. Wenn ich jedoch DogObject in einer if-Anweisung false machen könnte, könnte ich true zurückgeben, wenn es ein Array ist, und false zurückgeben, wenn es sich um ein DogObject handelt. – Ethan

0

Wenn ich verstehe, was Ihre Fragen, ich glaube, Sie wollen, dies zu tun:

if (!$dog){ 
    return "$dog was false"; 
} 

Die! bedeutet nicht. SO können Sie das lesen, "wenn nicht Hund, oder wenn Hund ist NICHT wahr"

+0

Es tut mir leid, wenn dies nicht das ist, was Sie gesucht haben ... wenn es nicht nur eine Nachricht hinterlassen, nicht zu viel vermerken, ich hatte Schwierigkeiten, Ihre Frage zu verstehen ... dachte, ich würde es versuchen . – micmoo

0

Unter welchen Bedingungen möchten Sie if($dog) zu falsch bewerten? Sie können nicht tun, was Sie buchstäblich verlangt haben, aber vielleicht könnte das Bedingte durch etwas ersetzt werden, das tut, was Sie wollen.

0

Wie wäre es mit einem Implicit Cast Operator wie der folgenden C#?

wie so:

class DogObject 
    { 
     public static implicit operator bool(DogObject a) 
     { 
      return false; 
     } 
    } 

Dann können Sie gehen ...

var dog = new DogObject(); 

    if(!dog) 
    { 
     Console.WriteLine("dog was false"); 
    } 
+0

funktioniert nicht in PHP, aber danke! – Ethan

+0

Ich war zu hastig, dies zu beantworten, ohne die Frage/Tags zu lesen! Entschuldigen Sie. –

0
class UserController 
{ 
    public function newuserAction() 
    { 
    $userModel = new UserModel(); 
    if ($userModel->insertUser()) { 
     // Success! 
    } else { 
     die($userModel->getError()); 
    } 
    } 
} 

Oder

class UserController 
{ 
    public function newuserAction() 
    { 
    $userModel = new UserModel(); 
    try { 
     $userModel->insertUser() 
    } 
    catch (Exception $e) { 
     die($e); 
    } 
    } 
} 

Es gibt eine Million Möglichkeiten, Fehler zu behandeln. Alles hängt von der Komplexität des Fehlers und der Anzahl der Wiederherstellungsoptionen ab.

2

Verwenden Sie das Schlüsselwort instanceof.

Zum Beispiel

$result = Users->insertNewUser(); 

if($result instanceof MyErrorClass){ 
    (CHECK WHAT WENT WRONG AND SAY WHY) 
} else { 
    //Go on about our business because everything worked. 
} 

Info is here.

+0

Hey, danke. Ich werde das machen. – Ethan

1

verwenden? Nicht eine echte saubere Lösung, aber das macht, was Sie wollen:

<?php 

    class Foo 
    { 
     private $valid = false; 

     public function Bar () 
     { 
      // Do stuff 
     } 

     public function __toString () 
     { 
      return ($this -> valid) ? '1' : '0'; 
     } 
    } 

?> 

Null betrachtet wird falsch wird ein wahr von PHP als

1

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

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

endlich, jemand, der versteht! Ich habe eigentlich nur instanceof benutzt, was nicht besonders viel war, also war es nicht so schlimm. Danke für die Hilfe. – Ethan

+0

genau das habe ich gesucht. Ich bin überrascht, dass das funktioniert. – Flion

+4

Eigentlich funktioniert das nicht ... du hast die Schecks gewendet. Wenn ($ false) ausgelöst wird, wird die Bedeutung als truthy ausgewertet, aber Sie drucken '' 'is false''' – Flion

1

Ich hatte vor kurzem etwas ähnliches zu tun, mit dem Null-Objekt-Muster. Unglücklicherweise gab das Null-Objekt true zurück, und die fragliche Variable war manchmal ein tatsächlicher Null-Wert (aus dem Standardparameter der Funktion). Der beste Weg, den ich gefunden habe, war if ((string) $ var) {obwohl dies für leere Arrays nicht funktionieren würde.