Frage

Gibt es eine Möglichkeit, eine Struktur-Klasse in PHP zu emulieren? dh eine Klasse, die von Wert übergibt und nicht nach, so kann es immer noch Art angedeutet sein ...

Und wenn ja, welche verschiedene Techniken verwendet werden könnten? Was ist die beste Technik?

Wenn dies möglich ist, könnten Sie natürlich eine voll typsicher Schicht für PHP erstellen, gibt es solche Schichten? Hat jemand Erfahrung mit diesem hatte?

War es hilfreich?

Lösung

Die Objekte werden immer als Referenz übergeben. Der einzige Weg, sie zu machen passieren, wie eine Kopie explizit ist, um das clone Schlüsselwort (ja, überall).

Meine Empfehlung wäre, um ein Array zu verwenden, die Werttypen sind und somit immer kopiert. Da Sie es als assoziatives Array verwenden können (zB string -> Wert), könnte es auch ein Objekt sein. Der Nachteil ist natürlich, können Sie diese Methoden nicht verwenden (aber das ist wie eine Struktur, so dass Sie mit diesem glücklich sein können). Es gibt keine Möglichkeit, Typsicherheit zu erzwingen, aber.

Aber mit allen Ihren Anforderungen es wie PHP klingt, ist nicht Ihre Art von Sprache, um ehrlich zu sein.

Andere Tipps

Ich denke, der einfachste Weg, es zu tun ist, wie Java tut -. Haben Ihre Wertklassen unveränderlich sein und lassen Sie alle „Modifikation“ Methoden ein neues Objekt zurück, anstatt

Ich glaube nicht, dass Sie dieses Ziel erreichen können, nur mit PHP-Code.

Sie haben keine Kontrolle darüber, wie PHP-Funktion-Handle-Parameter, und ich sehe nicht, wie Sie sicher, dass alles gehandhabt wird, um die Art und Weise machen könnten Sie wollen, ohne die (untere Ebene) Code in dem PHP-Binary ändern zu müssen und Module .

Es wäre ziemlich cool, aber:)

Ich spiele mit anonymem Vorschlag um alle Mutationen des Objekts zu machen ein neues Objekt zurück, und das funktioniert, aber es ist umständlich.

<?php
class FruityEnum {
    private $valid = array("apple", "banana", "cantaloupe");
    private $value;

    function __construct($val) {
        if (in_array($val, $this->valid)) {
            $this->value = $val;
        } else {
            throw new Exception("Invalid value");
        }
    }

    function __set($var, $val) {
        throw new Exception("Use set()!!");
    }
    function set(FruityEnum &$obj, $val) {
        $obj = new FruityEnum($val);
    }

    function __get($var) { //everything returns the value...
        return $this->value;
    }
    function __toString() {
        return $this->value;
    }
}

Und nun zu testen:

function mutate(FruityEnum $obj) { // type hinting!
    $obj->set($obj, 'banana');
    return $obj;
}

$x = new FruityEnum('apple');
echo $x; // "apple"
$y = mutate($x);
echo  $x // still "apple"
    . $y // "banana"

Es funktioniert, aber Sie haben eine seltsame Art und Weise zu verwenden, um das Objekt zu ändern:

$obj->set($obj, 'foo');

Die einzige andere Art, wie ich denke, könnte es zu tun wäre, die __set() Methode zu verwenden, aber das war noch schlimmer. Sie haben, dies zu tun, was blutige verwirrend ist.

$obj = $obj->blah = 'foo';

Am Ende ist es wahrscheinlich einfacher, die Variablen privat zu machen und keine Mutatoren bieten, so dass der einzige Weg, um eine Variable „Enum“ Wert zu ändern wäre ein neuer erstellen ein:

echo $obj; // "banana"
$obj = new FruityEnum("cantaloupe");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top