Unveränderbare Objekte in PHP?

8

Ist es eine gute Idee, Objekte zu erstellen, die in PHP nicht geändert werden können?

Zum Beispiel ein date-Objekt, das Setter-Methoden hat, aber immer eine neue Instanz des Objekts (mit dem modifizierten Datum) zurückgibt.

Würden diese Objekte für andere Personen, die die Klasse verwenden, verwirrend sein, weil Sie in PHP normalerweise erwarten, dass sich das Objekt ändert?

Beispiel

%Vor%     
Elfy 20.01.2013, 17:16
quelle

3 Antworten

5

Ein unveränderliches Objekt kann nach seiner anfänglichen Erstellung nicht geändert werden, so dass Setter-Methoden keinen Sinn ergeben, da es gegen dieses Grundprinzip verstößt.

Sie könnten einige Problemumgehungen implementieren, um die Unveränderlichkeit in PHP zu simulieren, indem Sie die Sichtbarkeit der Klassenmitglieder manipulieren und die magische __set () -Methode überschreiben, aber nicht unveränderbar, da die Unveränderlichkeit kein Merkmal der Sprache ist. Ich glaube, jemand hat einmal eine Erweiterung geschrieben, um einen unveränderlichen Werttyp in PHP zur Verfügung zu stellen, damit Sie googeln können.

    
pipe-devnull 20.01.2013, 18:02
quelle
17

Unveränderbare Objekte haben keine Setter-Methoden. Zeitraum.

Jeder erwartet, dass eine setXyz() -Methode einen void return-Typ hat (oder in locker typisierten Sprachen nichts zurückgibt). Wenn du deinem unveränderlichen Objekt Setter-Methoden hinzufügst, verwirrt das die Leute und führt zu hässlichen Bugs.

    
ThiefMaster 20.01.2013 17:19
quelle
8

Meiner Meinung nach sollten Objekte für Wertobjekte unveränderbar sein. Abgesehen davon hat es nicht viele Vorteile, es sei denn, Sie teilen Ihr Objekt über Ihre gesamte Anwendung.

Hier gibt es einige falsche Antworten, ein unveränderliches Objekt kann Setter haben . Hier ist eine Implementierung von unveränderlichen Objekten in PHP.

Beispiel # 1.

%Vor%

Wie Sie sehen können, sobald Sie instanziiert sind, können Sie keinen Wert ändern.

Beispiel 2: mit setters :

%Vor%

Es sind mehrere Implementierungen möglich und dies ist keineswegs eine exklusive Liste. Und denken Sie daran, dass es bei Reflection immer einen Weg gibt, um das in PHP zu umgehen, so dass die Unveränderlichkeit am Ende alles in Ihrem Kopf ist!

Es ist auch oft eine gute Übung, unveränderliche Objekte als endgültig zu betrachten.

BEARBEITEN:

  • hat setX für withX
  • geändert
  • Kommentar zum finalen
  • hinzugefügt
Théo 25.11.2015 02:52
quelle

Tags und Links

yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warningyii\base\ErrorException

PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: /usr/lib64/php/modules/mongodb.so (/usr/lib64/php/modules/mongodb.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/mongodb.so.so (/usr/lib64/php/modules/mongodb.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '324672',
    'url' => 'immutable-objects-in-php',
];

$_SESSION = [
    '__flash' => [],
];