Home

Awesome

sharable-value-objects

Build Status Coverage Status

Share value objects that contain the same primitive value as a singleton.

[!IMPORTANT] Singleton objects are kept under WeakReference.

[!TIP] You can compare objects like primitives through === operator!

Value::create('one') === Value::create('one')  // This should be true
Value::create('one') === Value::create('two')  // This should be false

Installing

composer require mpyw/sharable-value-objects

[!CAUTION] PHP 8.3.2 is incompatible due to the bug in the PHP core.

Usage

class ScreenName
{
    // 1. Mixin Sharable trait family
    use SharableString;

    // 2. Write your instantiation logic here
    public static function create(string $value): static
    {
        // Validation/Assertion
        if (!preg_match('/\A@\w{4,15}\z/', $value)) {
            throw new \InvalidArgumentException("invalid screen_name: $value");
        }

        // ** Call static::acquire() to get instance **
        return static::acquire($value);
    }

    // 3. Write your raw presentation logic here
    public function value(): string
    {
        // ** Call $this->getOriginalValue() to retrieve original value **
        return $this->getOriginalValue();
    }
}
class ScreenNameTest extends TestCase
{
    public function testSame(): void
    {
        // Same parameters yield the same instance
        $this->assertSame(
            ScreenName::create('@mpyw'),
            ScreenName::create('@mpyw'),
        );
    }

    public function testDifferent(): void
    {
        // Different parameters yield different instances
        $this->assertNotSame(
            ScreenName::create('@mpyw'),
            ScreenName::create('@X'),
        );
    }
}