DEV Community

Ghulam Mujtaba
Ghulam Mujtaba

Posted on

Value Objects and Mutability in OOP

Value objects are immutable objects that represent a set of values. They are used to encapsulate data and behavior, and are often used in domain-driven design.

Characteristics of Value Objects:

  • Immutable (cannot be changed once created)
  • Equal by value (not by reference)
  • No identity (no unique ID)
  • Can be used as array keys or hash map keys

Mutability:

Mutability refers to the ability of an object to change its state after creation.

Types of Mutability:

  • Mutable: Can change state after creation (e.g., arrays, objects with setters)
  • Immutable: Cannot change state after creation (e.g., value objects, strings)

Best Practices:

  • Use immutable objects when possible (e.g., value objects, data transfer objects)
  • Use mutable objects when necessary (e.g., entities, domain objects)
  • Avoid mixing mutable and immutable objects in the same class
<?php 

class Money {
  private $amount;
  private $currency;

  public function __construct($amount, $currency) {
    $this->amount = $amount;
    $this->currency = $currency;
  }

  public function getAmount() {
    return $this->amount;
  }

  public function getCurrency() {
    return $this->currency;
  }

  public function equals(Money $other) {
    return $this->amount === $other->amount && $this->currency === $other->currency;
  }
}
Enter fullscreen mode Exit fullscreen mode

Benefits of Immutable Objects:

  • Thread-safety
  • Easy to reason about and test
  • Can be used as cache keys or hash map keys
  • Reduces side effects and bugs

By using value objects and controlling mutability, we can write more predictable, maintainable, and scalable code in PHP OOP.

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more