Objekt zu einem booleschen Wert auswerten

Lesezeit: 3 Minuten

Folgendes berücksichtigen:

class MyClass
{
  private $var1 = "apple";
  private $var2 = "orange";
}

$obj = new MyClass();

if($obj) { 
  // do this
}
else {
  // do that
}

PHP wertet mein Objekt als wahr aus, weil es Member-Variablen hat. Kann diese Logik irgendwie außer Kraft gesetzt werden? Mit anderen Worten, kann ich steuern, was ein Objekt meiner Klasse auswertet, wenn es als boolescher Wert behandelt wird?

  • Nein, bisher können wir es nur im String Casting kontrollieren.

    – Wrikken

    6. April 2011 um 21:00 Uhr

  • Warum musst du dieses ungewöhnliche Verhalten haben?

    – Frostiges Z

    6. April 2011 um 21:04 Uhr

  • Das Beste, was Sie erreichen können, sind if( $obj() ) oder if ("$obj") oder if (count($obj)) anstelle der booleschen Auswertung.

    – mario

    6. April 2011 um 21:12 Uhr

Benutzeravatar von user229044
Benutzer229044

PHP wertet mein Objekt als wahr aus, weil es Member-Variablen hat.

Das ist falsch. PHP wertet tatsächlich aus $obj wie true weil es ein Objekt enthält. Es hat nichts mit dem Inhalt des Objekts zu tun. Sie können dies überprüfen, indem Sie die Mitglieder aus Ihrer Klassendefinition entfernen, es macht keinen Unterschied, welcher Zweig des if/else ausgewählt wird.

Es gibt keine Möglichkeit, PHP dazu zu bringen, eine Variable als falsch auszuwerten, wenn sie eine Referenz auf ein Objekt enthält. Sie müssten der Variablen etwas “Falsches” zuweisen, das die folgenden Werte enthält:

null
array()
""
false
0

Siehe die Konvertieren in Boolean aus der PHP-Dokumentation für eine Liste aller Werte, die behandelt werden als false bei Umwandlung in einen booleschen Wert.

  • WAHR. Zur Klarstellung für das OP, $obj ist nicht das Objekt. Vielmehr handelt es sich um eine Hinweis zum Speicherort des Objekts, das von PHP verwendet wird, um den Punkt im Speicher zu finden, an dem das eigentliche Objekt beginnt.

    – Agentenrätsel

    6. April 2011 um 21:10 Uhr


  • "PHP evaluates my object to true because it has member variables." This is incorrect. Eigentlich das war true in PHP 4, aber PHP 5 hat das Verhalten so geändert, dass es so ist, wie Sie es beschreiben. Nicht sehr relevant, aber historisch interessant.

    – Glücklicher Hund

    20. November 2020 um 14:05 Uhr


Das Beste, was Sie tun können, ist zu verwenden __invoke:

class MyObject {

    private $_state;

    public function __construct($state = false) {
        $this->_state = $state;
    }

    public function __invoke() {
        return $this->_state;
    }

}

$true  = new MyObject(true);
$false = new MyObject(false);

var_dump($true());   // true
var_dump($false());  // false

Nein, das kannst du nicht. Leider ist das boolesche Casting in PHP nicht änderbar, und ein Objekt wird immer wahr zurückgeben, wenn es in einen booleschen Wert konvertiert wird.

Da Sie eindeutig eine Logik haben, die Sie in diese Steueranweisung einfügen möchten, warum definieren Sie nicht eine Methode für Ihr Objekt (z. B. “isValid()” ), die die Bedingungen überprüft, die Sie überprüfen möchten, und ersetzen Sie dann:

if ($obj)

mit:

if ($obj->isValid())

  • Ja, ich denke, das ist, was ich tun muss, aber ich wollte nur das Codieren ein wenig vereinfachen.

    – Niko Jefimow

    7. April 2011 um 17:05 Uhr

Sie können eine kleine Erweiterung für PHP7 verwenden: https://github.com/p1ncet/obcast. Wie Sie der Beschreibung entnehmen können, können Sie ein Objekt in einen booleschen Wert umwandeln, indem Sie die neue interne Schnittstelle Boolable implementieren:

$obj = new class implements Boolable {
    public $container = [];
    public function __toBoolean() {
        return count($this->container) > 0;
    }
};

var_dump((bool) $obj);

$obj->container = [1];
var_dump((bool) $obj);

Ausgang:

bool(false)
bool(true)

Entschuldigen Sie die Verspätung, aber ich habe gerade mit einer ähnlichen Aufgabe gespielt und eine Art Hack/Workaround gemacht. Notiz "$object" Muster, das ruft __toString Methode.

class tst {
  public $r = true;
  function __toString() { return $this->r ? "1" : "0"; }
}
$object = new tst();
$object->r = true;
echo '<br />1: ';
if ("$object") echo 'true!'; else echo 'false!'; // "$object" becomes "1" == true
//echo "$object" ? 'true!' : 'false!';

$object->r = false;
echo '<br />0: ';
echo "$object" ? 'true!' : 'false!'; // "$object" becomes "0" == false

Ausgabe:

1: true!
0: false!

Benutzeravatar von William Rossier
William Rossier

Sie können es so machen: (bool) $yourObject

Wille

1404550cookie-checkObjekt zu einem booleschen Wert auswerten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy